Find
連結 find exec 和 while 循環
我正在嘗試堆疊一個查找命令,以便它返回的結果僅包含其中包含“警告:”或“錯誤:”文本的文件。我還需要特定格式的這些結果,所以我正在使用
exec stat
它。我可以得到這個版本的工作,但我需要能夠
-exec stat
在 while 循環中使用來製定一個特定的字元串,這-exec stat
讓我的 shell 把>
提示交給我。不工作的部分在下面以粗體顯示。另外,我可以讓這些工作。我不能在一起。
這是我工作的一個例子:
find . -type f -exec grep -li error: {} \; | while read -r file; do ls -l "$file"; done
所以現在我正試圖用另一個將文件限制為特定時間、類型等的程序來硬塞它。進展不順利:
查找 /my/directory/here/ -type f -name *.log -mmin -480 -mmin +60 -exec grep -li 警告:{} \; -exec grep -li 錯誤:{} \; **| 同時讀取-r文件;執行 -exec stat -c "$file" '%n|%y|%x|%s|%U|%u' {} \; 完畢**
-exec stat
請注意,如果我從 while 循環中刪除 ,整個事情都會起作用。如果我用簡單的 替換它ls -l
,結果會返回給我。現在 shell 只是給我一個命令提示符。我知道我做的不對,但我現在不知道我應該首先解決什麼。
find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \ -exec grep -qi warning: {} \; \ -exec grep -qi error: {} \; \ -exec stat -c '%n|%y|%x|%s|%U|%u' {} +
也就是說,你不需要兩個
grep
命令的實際輸出,只需要退出狀態,所以我們-q
用-l
. 不需要while
循環。可能會被多個文件呼叫,stat
所以我們使用-exec stat ... {} +
. 我還引用了該*.log
模式以防止它擴展到目前目錄中的任何此類名稱。有關的:
做同樣事情的另一種方法:
find /my/directory/here/ -type f -name '*.log' -mmin -480 -mmin +60 \ -exec sh -c ' for pathname do if grep -qi warning: "$pathname" && grep -qi error: "$pathname" then stat -c "%n|%y|%x|%s|%U|%u" "$pathname" fi done' sh {} +
這用作在子 shell 中執行
find
的循環的路徑名生成器。for
然而,這將為包含兩種模式匹配的每個文件呼叫stat
一次,因此它的效率略低。