.gzすべてのディレクトリとサブディレクトリのすべてのファイルを再帰的に文字列にgrepするにはどうすればよいですか?
.gzすべてのディレクトリとサブディレクトリのすべてのファイルを再帰的に文字列にgrepするにはどうすればよいですか?
回答:
@Steve Weetはもうすぐです。追加の引数として/ dev / nullを使用することは、ファイル名を強制的に表示する良い方法です(スティーブに感謝します)。しかし、見つかったすべてのファイルに対してexecを実行します-大きなオーバーヘッドです。
zgrepをできる限り数回実行して、各実行を最大限に活用したいとします。
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs可能な限り多くの引数(ファイル名)をzgrepに提供し、findコマンドによって提供されるすべてのファイルを使用するまで繰り返し実行します。-print0and -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ハックではなく、常に一致する行を含むファイル名を表示するために使用します。