7

ファイルにファイルのリストがあります。リストは膨大で、ファイル名は非標準です。つまり、スペース、ASCII 以外の文字、引用符、単一引用符が含まれているものがあります...

そのため、膨大なファイルのリストを引数として grep に渡すことはできません。

  • Linuxで許可されている引数の長さを超えないかどうか確信が持てないためです。ただし、引数を で分割することでこれを解決できると思いxargsます。
  • これらの文字をエスケープするのは複雑だからです。ファイル名を二重引用符で囲みたいのに、そのファイル名にたまたま二重引用符が含まれていたら、困ったことになります。そのため、いくつかの文字をエスケープする必要があります。全体が非常に複雑に見えますが、私はその道を歩きたくありません。

もっと簡単な方法があるに違いありません: grep の元のファイルとしてファイルのリストを使用するように grep に指示するにはどうすればよいですか? ファイルのリストはシェルによって処理されないため、エスケープと引数の長さはもはや問題ではないと思います。問題は、ドキュメントで見つけることができなかったこの操作モードを grep がサポートしているかどうかです。

4

1 に答える 1

8

私の知る限り、GNU grep はこれをサポートしていません。いくつかのオプションがあります。

bash ループを使用してファイル リストを解析する

これは@fedorquiが提供するソリューションです

while read file; do 
    grep "$PATTERN" "$file" 
done < file_with_list_of_files

xargs を使用して複数のファイルを一度に grep に渡す

ここで、xargs に 10 個のファイル名を grep に渡すように指示しました。

PATTERN='^$' # searching for blank lines
xargs -n 10 -d '\n' grep "$PATTERN" < file_with_list_of_files

xargs を使用して複数のファイルを一度に grep に渡し、ファイル名の改行を処理します

上記と同じですが、null で終わる行を使用します

PATTERN='^$' # searching for blank lines
tr '\n' '\0' file_with_list_of_files
xargs -n 10 -0 grep "$PATTERN" < file_with_list_of_files

編集:空白を正しく処理する 編集2:文字化けした出力を生成する例を削除し、改行を処理する例を追加します

于 2013-11-06T00:32:34.190 に答える