(再帰的に)ファイル名に「ABC」が含まれるすべてのファイルを検索したいのですが、ファイルにも「XYZ」が含まれています。私は試した:
find . -name "*ABC*" | grep -R 'XYZ'
しかし、正しい出力が得られません。
(再帰的に)ファイル名に「ABC」が含まれるすべてのファイルを検索したいのですが、ファイルにも「XYZ」が含まれています。私は試した:
find . -name "*ABC*" | grep -R 'XYZ'
しかし、正しい出力が得られません。
回答:
これgrep
は、ファイル名を読み取って標準入力から検索できないためです。あなたがしているのは、を含むファイル名を印刷することですXYZ
。代わりにfind
の-exec
オプションを使用します。
find . -name "*ABC*" -exec grep -H 'XYZ' {} +
からman find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered. The string `{}'
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find.
[...]
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
実際に一致する行は必要なく、少なくとも1つの文字列の出現を含むファイル名のリストのみが必要な場合は、代わりにこれを使用します。
find . -name "*ABC*" -exec grep -l 'XYZ' {} +
私は次のコマンドを最も簡単な方法で見つけます:
grep -R --include="*ABC*" XYZ
または、-i
大文字と小文字を区別しない検索に追加します。
grep -i -R --include="*ABC*" XYZ
… | grep -R 'XYZ'
意味を成さない。一方で-R 'XYZ'
は、XYZ
ディレクトリに対して再帰的に動作することを意味します。一方、… | grep 'XYZ'
手段は、パターンを探すためXYZ
にあるgrep
の標準入力。\
Mac OS XまたはBSDでは、パターンとしてgrep
扱いXYZ
、文句を言います:
$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ
GNU grep
は文句を言いません。むしろ、XYZ
パターンとして扱い、標準入力を無視し、現在のディレクトリから再帰的に検索します。
あなたがしたいことはおそらく
find . -name "*ABC*" | xargs grep -l 'XYZ'
…これは
grep -l 'XYZ' $(find . -name "*ABC*")
…両方とも一致するファイル名grep
を探すように指示しますXYZ
。
ただし、ファイル名に空白があると、これらの2つのコマンドが破損することに注意してください。区切り文字として使用することでxargs
安全に使用できますNUL。
find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'
しかし、@ terdonを使用したソリューションfind … -exec grep -l 'XYZ' '{}' +
はよりシンプルで優れています。
find
他の回答のいくつかと組み合わせて使用することもできます。