すべてのサブディレクトリのすべてのgzipファイル内の文字列のUnix 'grep'


8

.gzすべてのディレクトリとサブディレクトリのすべてのファイルを再帰的に文字列にgrepするにはどうすればよいですか?

回答:


13

@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 {} +

+1それは本当に素晴らしいことです。xargsが複数の引数を渡したことに気づかなかった。私の* nixコマンド行fuの多くは20年前のものであり、xargsが20年前にそうしたことはないと思います。
スティーブウィート

os / xでのfindはxargsと同じように動作することがわかります
Steve Weet

1
「+」で終わる-execに関するSteve Weetの回答に対する私のコメントを参照してください。
Daniel Andersson、2012年

-H少なくともGNU grepでは、一致する行を含むファイル名を常に表示するために使用します。
Daniel Andersson

1
$ 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 {} \

-execは、反復するすべてのファイルに対してzgrepの新しいインスタンスを生成し、ファイル名が表示されないようにします。zgrep -rツリーを使用するか、-rが機能しない場合は、findの出力をパイプで通過させる方がよいでしょうxargs zgrep
Noufal Ibrahim

/bin/zgrep: -r: option not supported新しくインストールしたubuntuシステムに乗りました。
aioobe 2010年

xargs代わりに使用できます。
Noufal Ibrahim、

「+」で終わる-execに関するSteve Weetの回答に対する私のコメントを参照してください。
Daniel Andersson、2012年

1

@aioobeはもうすぐです。コマンドはジョブを実行しますが、ファイル名を教えません

以下はファイル名も教えてくれるはずです:

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

を追加/dev/nullすると、zgrepが2つのファイル名を認識できるようになるため、文字列が見つかった場合にファイルの名前が表示されます。

編集

さらなる調査により、私のマシン(OS / X)では、-exec検索する引数により、可能な限り多くのファイル名が追加されることがわかります(xargs動作と同様)。


それはかなりクールです、私はOSXについてそれを知りませんでした-exec-私はすべて移植性を重視しているので、スクリプトでそれを使用しませんが、コマンドプロンプトには最適です。

findの他のバージョンでは、「\;」の代わりに「+」を使用します。execステートメントを終了すると、OSXと同じように実行されます。このスレッドのストーリーでは、デフォルトで実行されます。「-execコマンド{} +」のマニュアルエントリを参照してください。これはのすべてのバージョンに当てはまるわけではありませんが、最新バージョンのfindほとんど(Debianベースのディストリビューションなど)には当てはまります。
Daniel Andersson

-H少なくともGNU grepでは、/dev/nullハックではなく、常に一致する行を含むファイル名を表示するために使用します。
Daniel Andersson、2012年

0

次の作品で御馳走 zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

それはまたで働くことbashkshなど、...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.