ディレクトリ内のすべてのファイルを繰り返し処理して何かを見つける必要がある場合があり、そのためには通常for i in $(ls *.txt)
は通常どおり機能します。for
ただし、フォルダー内にファイルが多すぎて生成される場合があります0403-027 The parameter list is too long.
(つまりfor
、、、、または何diff
でもls
)。
そのための1つの解決策は、入力を1行ずつ読み取ることですwhile read
が、それは難しい部分です。最初は、理想は次のようなものだと思っていました。
while read file ; do
# do something with file
done < $(find . -type f -name *.txt)
しかし、それは区切り文字で満たされた単一の行を返します^J
(変ですか?)。そしてもちろん、そのようなファイルはありません。に変更IFS
して\n
もうまくいきませんでした。
私の現在の回避策は、興味のあるすべてのファイルを含む一時ファイルを作成してから、while を使用することです。
tmpfile=$$.$(date +'%Y%m%d%k%M%S').tmp
find . -type f -name *.txt > $tmpfile
while read file ; do
# do something with file
done < $tmpfile ; rm $tmpfile
しかし、それは適切ではなく、最初のオプションよりもはるかに多くのコードが必要です。誰かが最初のループを実行する正しい方法を教えてくれませんか?
ありがとう!