Bash

當從 xargs 傳遞參數時,Zgrep 在第一次匹配後停止

  • September 19, 2013

我正在使用此命令在此處建議的 zip 文件中查找模式(類似於一個) https://superuser.com/questions/144926/unix-grep-for-a-string-within-all-gzip-files-在所有子目錄中

find . -regex ".*/.*zip" | xargs zgrep -m 1 -E "PATTERN"

第一場比賽后,Grepping仍在繼續。可能find/xargs是罪魁禍首。grep找到第一個匹配項後如何停止查找?

PS如何在第一次匹配後停止查找命令?將不起作用,因為find需要在 grep 成功的匹配之後停止,而不僅僅是 find 的第一個匹配。

幾件事:

  • zgrep是查看.z.gz壓縮文件,而不是壓縮zip檔案中的文件。

zipgrep有時會與 , 捆綁一個(損壞的)腳本unzip來查看zip檔案,但它的作用是egrep在檔案的每個成員上執行(因此-m1每個egrep都會報告每個文件的第一個匹配項)。

zgrep, 同樣是一個腳本,它為每個文件提供togzip的輸出。可以解壓縮文件,但僅對存檔的第一個成員進行,並且僅在壓縮文件時才這樣做(在文件中,並非所有成員都必須壓縮,尤其是小成員)。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每個文件執行一個 shell ,但也會zipgrep執行更多命令。

如果存檔成員的名稱包含萬用字元(*, [, ?)或其他字元(如 ASCII 字元 0x1 到 0x1f 和其他各種字元),它可能會失敗,但這主要是unzip由於zipgrep.

引用自:https://unix.stackexchange.com/questions/91344