xargs で引数が渡されると、最初の一致後に Zgrep が停止します。

xargs で引数が渡されると、最初の一致後に Zgrep が停止します。

このコマンドを使用して、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コマンドをどのように停止できますか?findfindの最初の一致だけでなく、成功した一致の後にgrepを停止する必要があるため、機能しません。

ベストアンサー1

いくつか:

  • zgrep圧縮アーカイブ内のファイルで.zはなく圧縮ファイルを表示します。.gzzip

    zipgrepアーカイブを表示するために時々unzip一緒にバンドルされている(壊れた)スクリプトがありますが、このスクリプトzipの機能はegrepアーカイブのすべてのメンバーで実行されます(したがって、-m1各メンバーはegrep各ファイルの最初の発生を報告します)。

    zgrepgzip、各ファイルの出力を提供するスクリプトも同様です。ファイルを解凍できますが、アーカイブの最初のメンバーと圧縮されている場合にのみ可能です(ファイル内のすべてのメンバー、特に小さなメンバーを圧縮する必要はありません)。gzip -cdfqgrepgzip -dzipzip

  • 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のバグと制限によるものです。unzipzipgrep

おすすめ記事