[英]Status after each argument passed to -exec in find
我正在編寫一個快速腳本來列出目錄中的所有文件,在每個文件上運行一個函數,然后打印出狀態代碼。 現在我想要的狀態代碼是整個事務,而不是最后執行的表達式。 例如...
find ./ -maxdepth 1 -name \*.txt -exec my_function {} \;
假設我的目錄中有以下文件file1.txt
, file2.txt
, file3.txt
。 當file1.txt
傳遞給-exec
其狀態代碼為1
但調用file2.txt
和file3.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.