検索結果でxargsを使用するときにファイル名のスペースを処理するにはどうすればよいですか?


28

私の一般的なプラクティスの1つは、特定のタイプのすべてのファイルに対してgrepsを実行することです。たとえば、「rumpus」という単語を含むすべてのHTMLファイルを見つけます。それをするために、私は

find /path/to -name "*.html" | xargs grep -l "rumpus"

時々、find名前にスペースなどのファイルを返しますmy new file.html。ときにxargsこれをするために渡されたgrep、しかし、私はこれらのエラーを取得します:

grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory

私はここで何が起こっているのかを見ることができます:パイプまたはパイプxargsはスペースをファイル間の区切り文字として扱っています。しかし、私の人生では、この動作を防ぐ方法がわかりません。find+ で実行できますxargsか?または、まったく異なるコマンドを使用する必要がありますか?

回答:


29

つかいます

find ... -print0 | xargs -0 ...

例えば

find /path/to -name "*.html"  -print0 | xargs -0  grep -l "rumpus"

find manページから

-print0
          True; print the full file name on the standard  output,  followed
          by  a  null  character  (instead  of  the  newline character that
          ‘-print’ uses).  This allows file names that contain newlines  or
          other  types  of  white space to be correctly interpreted by pro-
          grams that process the find output.  This option  corresponds  to
          the ‘-0’ option of xargs.

15

あなたは使用する必要はありませんxargsのをので、検索は、コマンド自体を実行することができます。これを行うとき、シェルが名前の文字を解釈することを心配する必要はありません。

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

find manページから

-exec command {} +
この-execアクションのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンドラインは、選択された各ファイル名を最後に追加することによって構築されます。コマンドの呼び出しの総数は、一致するファイルの数よりもはるかに少なくなります。コマンドラインは、xargsがコマンドラインを作成するのとほぼ同じ方法で作成されます。コマンド内では、 `{} 'の1つのインスタンスのみが許可されます。コマンドは開始ディレクトリで実行されます。


私はこれに賛成しますが、今日はまだ残っていません-明日やります。
user9517はGoFundMonicaを

1
@Iain-そこに行きます(ところで同意します)。
エドゥアルドイヴァネック

findを使用するだけで、xargsの機能を見逃すことになり、さらに愚かな引用ルールに対処する必要があります。複数のコア/ CPUがある場合は、xargsの-P引数を参照してください。
Slartibartfast

8

システム上のfindおよびxargバージョンがサポート-print0および-0スイッチ(AIX findおよびxargsなど)をサポートしていない場合、これを使用できます。

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

ここで、sedはxargsのスペースをエスケープします。


これは、私が何度も使用した、作成が困難なファイル名の長いリストがあるために役立ちました。私はfindそれらすべてを再び行くことはできません。
スコットM.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.