2014-10-04 225 views
2

我需要在目錄中遞歸查找一種類型的文件。然後爲每個文件發現找到的文件作爲參數執行腳本:Bash - 防止腳本在錯誤時停止執行

#!/bin/bash 
find /mnt/storage/content/www/html/smartsite/src/data/resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /mnt/storage/content/www/html/smartsite/cron/VideoConvert/convert {} \; 

它的工作原理應該,當調用的腳本(轉換)拋出錯誤但將停止執行。我想阻止這種情況,並繼續執行下一個找到的文件。無論我做什麼,例如

/convert || true {} \; 

/convert {} || true \; 

它總是拋出一個錯誤 「沒有paremeters的高管」。我究竟做錯了什麼?

+1

出於好奇,你能解釋'拋出錯誤'還是提供腳本? 'find'的執行不應該停在'stderr'上,或者即使腳本返回一個錯誤退出代碼('-exec'將會變成false,這將阻止'-exec'執行後的表達式,並導致'find '轉到下一個文件,但是因爲你的命令中'-exec'後面沒有表達式,所以這應該不重要) – BroSlow 2014-10-04 08:58:50

+0

「convert」腳本中有ffmpeg調用。如果ffmpeg失敗,找到停止搜索。我想要防止這種情況發生,找到下一個文件。所以我要麼需要確保「convert」腳本不會向stderr或add ||添加任何錯誤如果發現腳本失敗,則查找/ exec以傳遞「true」退出代碼來查找 – user1209216 2014-10-04 10:26:06

回答

1

這似乎是確定:

convert {} \; || true 
2

試試這個

find ... -exec bash -c "convert {} || true" ";" 

find ... -print0 | xargs -r -0 -i convert {} 
2

眼前的問題是,解析順序不工作,你的思考方式它確實如此。命令:

find /.../resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /.../convert || true {} \; 

獲取由殼解析成兩個命令(由||分隔):

find /.../resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /.../convert 
true {} \; 

...並且由於\;是一個單獨的命令的一部分,find永遠看不到它,並抱怨說你沒有給它一個完整的-exec序列。您可以引用/轉義||,因此它會作爲-exec序列的一部分傳遞給find,但這樣做不會達到您想要的效果,因爲-exec只是運行單個命令,並將其作爲參數傳遞給命令,這樣的轉換腳本會得到||true作爲參數...

爲了做你想做什麼,你實際上必須有-exec運行另一個shell,並有子shell運行轉換腳本和true。這可以做到,儘管它有點混亂,但它也不能解決實際問題,因爲實際問題不是你想象的那樣。

正如@BroSlow所說,find ... -exec不會停止只是因爲該命令返回錯誤狀態(或輸出到stderr)。還有一件事是讓find停止,所以重寫退出狀態並不能解決問題。你需要弄清楚實際的問題,併發起攻擊。