5

find . -name "*.xml" | xargs grep FOOリターンがファイル名と一致するのに一致しないのはなぜfind . -name "*.xml" | xargs -i -sh -c "grep FOO {}"ですか?

4

3 に答える 3

8

質問を投稿する際のタイプミスでない限り、前にハイフンがあってはなりませんsh:

出力にファイル名が表示されない理由はgrep、単一のファイルを引数として実行されているためです。ファイル名の出力を強制するには、-H.

find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"

また、-iforxargsはバージョン 4.2.9 で非推奨になりました。を使用する必要があります-I {}

于 2011-03-04T15:44:47.713 に答える
4

前の回答で述べたように、違いは、ファイルごとに grep が呼び出され、 -H (--with-filename) フラグが指定されていない限り、コマンド ラインでファイルが 1 つだけ指定されている場合、grep はファイル名を報告しないことです。

ファイルごとに grep が呼び出されるのはなぜですか? これは、(好むと好まざるとにかかわらず) xargs に -I (または -i) フラグを使用すると、xargs にフラグ "-L 1" を使用するように、各引数に対してコマンドが強制的に実行されるためです。

マニュアルページから:

   -I replace-str
     Replace occurrences of replace-str in the initial-arguments with names read from
     standard input.  Also, unquoted blanks do not terminate input items; instead the
     separator is the newline character.  Implies -x and -L 1.
于 2013-10-12T14:49:01.980 に答える
0

あなたはただ使うことができます

find . -name "*.xml" | xargs -I{} grep FOO {}

必要に応じてコマンドで-Hor-nを使用できます。grep

于 2013-03-14T02:21:11.267 に答える