すべてのディレクトリとサブディレクトリにあるすべての.gz
ファイルを再帰的にgrepするにはどうすればよいですか?
@SteveWeetはもうすぐです。追加の引数として/ dev/nullを使用することは、ファイル名を強制的に表示するための優れた方法です(Steveに感謝します)が、見つかったすべてのファイルに対してexecを実行します-大きなオーバーヘッドです。
Zgrepをできるだけ数回実行して、各実行を最大限に活用したいとします。
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
はzgrepにできるだけ多くの引数(ファイル名)を提供し、find
コマンドによって提供されたすべてのファイルを使用するまで繰り返し実行します。 -print0
および-0
オプションを使用すると、ファイル名またはディレクトリ名のいずれかにスペースがある場合に機能します。
Mac OS Xでは、xargsなしで同じ効果を達成できます。
find . -iname '*.gz' -exec zgrep PATTERN {} +
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
だから何かのような
find . -iname "*.gz" -exec zgrep PATTERN {} \
@aioobeはもうすぐです。コマンドは仕事をしますが、ファイル名は教えてくれません
以下は、ファイル名も教えてくれるはずです。
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
/dev/null
を追加すると、zgrepが2つのファイル名を認識できるようになるため、文字列が見つかった場合はファイルの名前が表示されます。
[〜#〜]編集[〜#〜]
さらなる調査により、私のマシン(OS/X)の場合、検索する-exec
引数は、可能な限り多くのファイル名を追加することが明らかになりました(xargs
の動作と同様)。
以下はzsh
で扱います
for archive in **/*.gz; do
echo "[${archive}] "
gzip -dc ${archive} | grep -n "String"
done
bash
、ksh
などでも機能する可能性があります。