3

xargs で grep を実行することに関する簡単な質問です。これを行うと、次のような、検索条件に正常に一致するファイルが散在する、存在しないファイルからの一連の結果が表示されます。

find . | xargs grep 'Cache'

grep: PT: No such file or directory
grep: Sans: No such file or directory
grep: Free: No such file or directory
grep: Font: No such file or directory
grep: License.txt: No such file or directory

ヒットのみを表示する、渡すことができる引数はありますか?

ありがとう。

4

4 に答える 4

7

findファイル名にはスペースが含まれているため、結果を改行ではなくNULバイトで区切って出力するように指示する必要があります。代わりに次のことを試してください。

find . -print0 | xargs -0 egrep 'Cache'

-0toは、STDINからのxargsデータをNULバイトで区切られているものとして解釈することを示しています。(ここでは一重引用符Cacheは不要です。)

Unixライクなシステムの多くのツールにも同様に、NULバイトで区切られたデータを生成または消費するオプションがあります。これは、ファイル名またはディレクトリ名で許可されていない2バイトが0x00and 0x2F(スラッシュ)のみであるためです。これは、安全に処理するための一般的な方法です。スペースまたは改行を含むファイル名を使用します。

最後に、非常にうるさいので、次のように変更することをお勧めします。

xargs -0 egrep Cache /dev/null

...常に複数のパラメータが存在することを確認grepし、ファイル名の前に一貫して接頭辞が付けられた出力を取得できるようにします。

于 2011-04-18T08:21:43.577 に答える
1

GNU をお持ちの場合はgrep、再帰的にしてください

grep -R "Cache" *
于 2011-04-18T09:49:05.720 に答える
1
find . | xargs grep 'Cache' 2>/dev/null
于 2011-04-18T12:35:27.210 に答える
0

xargsでfindを使用する場合は、http://en.wikipedia.org/wiki/Xargs#The_separator_problemのセパレーターの問題があるため、常に-print0を使用する必要があります。ただし、それぞれが1行にあるファイルのリストがある場合は、GNUParallelを確認することをお勧めします。

find . | parallel grep Cache

詳細については、紹介ビデオをご覧ください:http ://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2011-04-18T14:29:25.913 に答える