簡體   English   中英

每個參數傳遞給find中的-exec后的狀態

[英]Status after each argument passed to -exec in find

我正在編寫一個快速腳本來列出目錄中的所有文件,在每個文件上運行一個函數,然后打印出狀態代碼。 現在我想要的狀態代碼是整個事務,而不是最后執行的表達式。 例如...

find ./ -maxdepth 1 -name \*.txt -exec my_function {} \;

假設我的目錄中有以下文件file1.txtfile2.txtfile3.txt file1.txt傳遞給-exec其狀態代碼為1但調用file2.txtfile3.txt返回0 當我打電話給echo $? 盡管在file1.txt調用返回1但最后它從最后執行的表達式返回0 我想要的是一個非零的狀態代碼,如果任何表達式在上面的腳本中返回非零值,就像對file1.txt所描述的那樣。 我該怎么辦呢?

我會建議這樣的事情:

status=0
while IFS= read -d '' -r file; do
   my_function "$file"
   ((status |= $?))
done < <(find . -maxdepth 1 -name '*.txt' -print0)

echo "status=$status"

如果my_function任何存在狀態為1 ,則將打印status=1

find . -maxdepth 1 -name \*.txt  -print0 | xargs -r0 -I {} sh -c "echo {}; echo $?;"

根據從lcd047收到的建議,為了避免名稱包含"問題,更好的解決方案是

find . -maxdepth 1 -name \*.txt  -print0 | xargs -r0 -I {} sh -c 'printf "%s\n" "$1"; echo $?' sh {} \;

你可以做這樣的事情(用GNU find測試),它會為exec返回非零狀態的每個文件打印一行:

find . -maxdepth 1 -name "*.txt" '(' -exec my_function {} \; -o -printf 1\\n ')'

您可以使用-printf打印更具信息性的內容,例如文件名。 但無論如何,如果某個文件的my_function失敗,則只會輸出。 (或者,如果它打印的東西。)

雖然-exec ... \\; 僅返回退出狀態作為主要的真值, -exec ... {} +會導致find調用返回非零退出狀態,如果任何調用返回非零退出狀態(並始終返回true作為主要,因為一次調用可能會處理多個文件)。

如果my_function處理多個參數,那么

find ./ -maxdepth 1 -name \*.txt -exec my_function {} \;

會做的。

如果沒有,你可以做到

find ./ -maxdepth 1 -name \*.txt -exec sh -c 'r=0; for arg do my_function "$arg" || r=1; done; exit "$r"' sh {} \;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM