find . -name "*.xml" | xargs grep FOO
リターンがファイル名と一致するのに一致しないのはなぜfind . -name "*.xml" | xargs -i -sh -c "grep FOO {}"
ですか?
8906 次
3 に答える
8
質問を投稿する際のタイプミスでない限り、前にハイフンがあってはなりませんsh
:
出力にファイル名が表示されない理由はgrep
、単一のファイルを引数として実行されているためです。ファイル名の出力を強制するには、-H
.
find . -name "*.xml" | xargs -I {} sh -c "grep -H FOO {}"
また、-i
forxargs
はバージョン 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 {}
必要に応じてコマンドで-H
or-n
を使用できます。grep
于 2013-03-14T02:21:11.267 に答える