.gz
すべてのディレクトリとサブディレクトリのすべてのファイルを再帰的に文字列にgrepするにはどうすればよいですか?
.gz
すべてのディレクトリとサブディレクトリのすべてのファイルを再帰的に文字列にgrepするにはどうすればよいですか?
回答:
@Steve Weetはもうすぐです。追加の引数として/ dev / nullを使用することは、ファイル名を強制的に表示する良い方法です(スティーブに感謝します)。しかし、見つかったすべてのファイルに対してexecを実行します-大きなオーバーヘッドです。
zgrepをできる限り数回実行して、各実行を最大限に活用したいとします。
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
可能な限り多くの引数(ファイル名)をzgrepに提供し、find
コマンドによって提供されるすべてのファイルを使用するまで繰り返し実行します。-print0
and -0
オプションを使用すると、ファイル名またはディレクトリ名にスペースが含まれている場合でも機能します。
Mac OS Xでは、xargsなしで同じ効果を得ることができます。
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
少なくともGNU grepでは、一致する行を含むファイル名を常に表示するために使用します。
$ 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 {} \
zgrep -r
ツリーを使用するか、-rが機能しない場合は、findの出力をパイプで通過させる方がよいでしょうxargs zgrep
/bin/zgrep: -r: option not supported
新しくインストールしたubuntuシステムに乗りました。
xargs
代わりに使用できます。
@aioobeはもうすぐです。コマンドはジョブを実行しますが、ファイル名を教えません
以下はファイル名も教えてくれるはずです:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
を追加/dev/null
すると、zgrepが2つのファイル名を認識できるようになるため、文字列が見つかった場合にファイルの名前が表示されます。
編集
さらなる調査により、私のマシン(OS / X)では、-exec
検索する引数により、可能な限り多くのファイル名が追加されることがわかります(xargs
動作と同様)。
find
ほとんど(Debianベースのディストリビューションなど)には当てはまります。
-H
少なくともGNU grepでは、/dev/null
ハックではなく、常に一致する行を含むファイル名を表示するために使用します。