回答:
現在のディレクトリ内のすべての.eml.gzファイルで再帰的にgrepする場合は、次を使用できます。
find . -name \*.eml.gz -print0 | xargs -0 zgrep "STRING"
*
シェルが解釈しないように、最初のものをエスケープする必要があります。-print0
見つかった各ファイルの後にヌル文字を出力するようにfindに指示します。xargs -0
標準入力から読み取り、ファイルごとにコマンドを実行します。zgrep
のようgrep
に機能しますが、最初にファイルを圧縮解除します。
zgrep
実際にはgrep
、非圧縮ファイルで実行するよりも速いようです。圧縮ファイルはHDから読み取られ、HDから圧縮されていないファイルを読み取るよりも速く解凍できるためです。
xargs
は空白(空白)を使用します。確かに、ファイルに改行が含まれることはほとんどありませんが、スペースは前代未聞ではありません(たとえほとんどのUNIXのタイプがそれらに眉をひそめていても)。とはいえ、空白を心配することなく、より簡単に単純化できます:find . -name '*.eml.gz' -exec zgrep "STRING" {} +
起動ごとに同じ多くの引数xargs
、-print0
/ の安全性-0
、および余分なプロセスの起動とパイプのオーバーヘッドなしで、かなり簡潔に取得します。-exec
with +
はPOSIXで指定されているため、私の知る限り、ほとんどの最近のUNIXライクなシステム上にあるはずです。
ABCLog04_18_18_2_21.gz
ABC *で始まるファイルを再帰的に検索する方法はありますか。私が交換しようとした\*.eml.gz
との上にあなたの例ではABCLog*
:ファイル形式についてのエラーが出るfind: paths must precede expression: ABCLog-2018-03-12-10-16-1.log.gz Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
1つだけではないため、ここには多くの混乱がありzgrep
ます。システムにはzgrep
from gzip
とzgrep
fromの2つのバージョンがありzutils
ます。前者は、を呼び出す単なるラッパースクリプトですgzip -cdfq
。-r, --recursive
スイッチはサポートしていません。1
後者はc++
プログラムであり、オプションをサポートしてい-r, --recursive
ます。
実行zgrep --version | head -n 1
すると、そのうちのどれがデフォルトであるかが明らかになります:
zgrep (gzip) 1.6
ラッパースクリプトです。
zgrep (zutils) 1.3
あるcpp
実行可能ファイルが。
後者がある場合は、次を実行できます。
zgrep 'pattern' -r --format=gz /path/to/dir
とにかく、提案されているように、find
+ zgrep
は次のいずれのバージョンでも同様に機能しますzgrep
。
find /path/to/dir -name '*.gz' -exec zgrep -- 'pattern' {} +
場合はzgrep
、あなたのシステムから欠落している(非常に低い)あなたが試みることができます:
find /path/to/dir -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "pattern"' {} \;
ただし、大きな欠点があります。一致する行の前にファイル名が付加されていないため、一致する場所がわかりません。
1:問題があるため
zgrep
zutilsから入手できない場合は、を使用してUbuntuにインストールできますsudo apt-get install zutils
。
grep -n
、zgrep -n
行番号を出力します。マニュアルに記載されています
ag
はのバリアントで grep
、いくつかの素晴らしい追加機能があります。
そう:
ag -r -z your-pattern-goes-here folder
インストールされていない場合、
apt-get install silversearcher-ag (debian and friends)
yum install the_silver_searcher (fedora)
brew install the_silver_searcher (mac)
ag: truncated file: Success
結果として得られます。他のフラグを追加する必要がありますか?
再帰だけは簡単です:
-r, --recursive
Read all files under each directory, recursively, following
symbolic links only if they are on the command line. This is
equivalent to the -d recurse option.
-R, --dereference-recursive
Read all files under each directory, recursively. Follow all
symbolic links, unlike -r.
ただし、圧縮ファイルには次のようなものが必要です。
shopt globstar
for file in /path/to/directory/**/*gz; do zcat ""$file" | grep pattern; done
path/to/directory
毎日のサブディレクトリを含む親ディレクトリにする必要があります。
zgrep
は明らかな答えですが、残念ながら、-r
フラグをサポートしていません。からman zgrep
:
これらのgrepオプションにより、zgrepはエラーコード(-[d rR zZ] | --di * | --exc * | --inc * | --rec * | --nu *)で終了します。
システムにzgrepがある場合、簡単にできます
zgrep -irs your-pattern-goes-here the-folder-to-search-goes-here/
システムにzgrepがない場合は、findコマンドを使用して、zcatとgrepを各ファイルに対して次のように実行できます。
find the-folder-to-search-goes-here/ -name '*.gz' \
-exec sh -c 'echo "Searching {}" ; zcat "{}" | grep your-pattern-goes-here ' \;
Searching ~/gmvault-db/db/2015-02/03/whatever.gz
zgrep
-r
何らかの理由でフラグを取得しません。それについては言及していますman zgrep
(私の回答も参照してください)。
xzgrep -l "string" ./*/*.eml.gz
xzgrepはzgrep utilsの派生物です(/ bin / xzgrep未満)
Manページから:
xzgrepは、非圧縮またはxz(1)、lzma(1)、gzip(1)、bzip2(1)、またはlzop(1)で圧縮されたファイルでgrep(1)を呼び出します。指定されたすべてのオプションは、grep(1)に直接渡されます。
-l一致するファイル名を出力します
-再帰のRは、スクリプトで特に禁止されているため機能しませんが、単純なシェルグロビングはそこに到達するはずです
./*/*.eml.gz
./today/sample.eml.gzの相対パスから、シェル内の相対位置の1レベル下のすべてのインスタンスに一致し、「。eml.gz」で終わる
zgrep
:zgrep - search possibly compressed files for a regular expression