0

ディレクトリ内のすべてのファイルを繰り返し処理して何かを見つける必要がある場合があり、そのためには通常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

しかし、それは適切ではなく、最初のオプションよりもはるかに多くのコードが必要です。誰かが最初のループを実行する正しい方法を教えてくれませんか?

ありがとう!

4

1 に答える 1

1

この状況では、コマンド置換ではなく、プロセス置換が必要です。

while IFS= read -r file ; do
    # do something with file
done < <(find . -type f -name *.txt)

プロセス置換は基本的にファイルの<()ように機能し、while ループにリダイレクトできます。

于 2012-05-14T10:21:31.110 に答える