特定のディレクトリにある特定の種類のすべてのファイルに対していくつかのタスクを実行したいと思います。私はbashスクリプトに次のように書きました。
HANDIN_FILES=`find . -type f -printf "%f\n" | head -20 `
for i in $HANDIN_FILES
do
echo $i
done
最初のバージョンに。ファイル名にスペースが含まれていない場合は完全に機能します。ファイルがある場合は、silly name.txt
ファイルが最初に出てから次にi
なります。これは私が望むものではありません。silly
name.txt
do ... done
コマンド-exec
のオプションにすべてを入れることができることを知っていますが、find
後で使用するためにファイルリストをシェル変数に保存したいと思います。誰かがi
ループを一度繰り返して値を取得するためのクイック修正を提案できますか?silly name.txt
答え1
4.4+ バージョンbash
:
readarray -td '' files < <(find . -type f -print0 | head -zn 20)
for i in "${files[@]}"; do
something with "$i"
done
以前のバージョンのbashの場合:
files=()
while IFS= read -rd '' file; do
files+=("$file")
done < <(find . -print0 | head -zn 20)
for i...
ここでは使いやすくなりますzsh
。
files=(**/*(D.[1,20]))
for i ($files) something with $i
(少なくともファイルリストは次のようにソートされます。上位20位もっと意味があります)
バラより検索結果を繰り返すのはなぜ悪い習慣ですか?出力を処理(または処理しない)するための追加のfind
方法です。