Bash
當從 xargs 傳遞參數時,Zgrep 在第一次匹配後停止
我正在使用此命令在此處建議的 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
.