2014-10-04 188 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停止,所以重写退出状态并不能解决问题。你需要弄清楚实际的问题,并发起攻击。