Find

連結 find exec 和 while 循環

  • August 24, 2021

我正在嘗試堆疊一個查找命令,以便它返回的結果僅包含其中包含“警告:”或“錯誤:”文本的文件。我還需要特定格式的這些結果,所以我正在使用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一次,因此它的效率略低。

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