このコマンドを使用して、zipファイルでパターンを見つけます(ここで提案されているパターンと似ています)。 https://superuser.com/questions/144926/unix-grep-for-a-string-within-all-gzip-files-in-all-subdirectories
find . -regex ".*/.*zip" | xargs zgrep -m 1 -E "PATTERN"
初戦以降もグレッピングは続いた。たぶんfind
/xargs
犯人かもしれません。grep
最初の一致を見つけたら検索を停止するにはどうすればよいですか?
ポリスチレン最初の一致後にfindコマンドをどのように停止できますか?find
findの最初の一致だけでなく、成功した一致の後にgrepを停止する必要があるため、機能しません。
ベストアンサー1
いくつか:
zgrep
圧縮アーカイブ内のファイルで.z
はなく圧縮ファイルを表示します。.gz
zip
zipgrep
アーカイブを表示するために時々unzip
一緒にバンドルされている(壊れた)スクリプトがありますが、このスクリプトzip
の機能はegrep
アーカイブのすべてのメンバーで実行されます(したがって、-m1
各メンバーはegrep
各ファイルの最初の発生を報告します)。zgrep
gzip
、各ファイルの出力を提供するスクリプトも同様です。ファイルを解凍できますが、アーカイブの最初のメンバーと圧縮されている場合にのみ可能です(ファイル内のすべてのメンバー、特に小さなメンバーを圧縮する必要はありません)。gzip -cdfq
grep
gzip -d
zip
zip
xargs
必要な数のコマンドを実行しますが、ファイルのリストが大きい場合は、複数のコマンドを実行できます。
ここで最良のオプションはzipgrep
手動で実装することです(ここではGNUツールを使用して)。
find . -name '*.zip' -type f -exec sh -c '
unzip -Z1 "$1" |
while IFS= read -r file; do
unzip -p "$1" "$file" | grep --label="$1//$file" -Hm1 -- "$0" && exit
done' PATTERN {} \; -quit
各ファイルはシェルを実行しますが、より多くのコマンドもzipgrep
実行します。zipgrep
アーカイブメンバーの名前にワイルドカード(*
、、、[
)などの文字(ASCII文字0x1〜0x1fなどのさまざまな文字)が含まれていると失敗することがありますが、これは?
主にSo badのバグと制限によるものです。unzip
zipgrep