Bash - 防止脚本在出错时停止执行

时间:2014-10-04 07:31:54

标签: bash error-handling find exec

我需要在目录中递归查找一种类型的文件。然后为每个文件找到执行脚本,找到文件作为参数:

#!/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 \;

它总是会抛出一个错误" exec"没有参数。我做错了什么?

3 个答案:

答案 0 :(得分:2)

试试这个

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

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

答案 1 :(得分:2)

直接的问题是解析顺序不像你想象的那样工作。命令:

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

将shell解析为两个命令(由||分隔):

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

...由于\;是单独命令的一部分,find永远不会看到它,并抱怨你没有给它一个完整的-exec序列。您可以引用/转义||,以便它作为find序列的一部分传递给-exec,但这也不会达到您想要的效果,因为-exec只是运行单个命令,并将它作为参数提供给该命令,因此转换脚本将||true作为参数...

为了做你想做的事情,你实际上必须让-exec运行另一个shell,让子shell运行转换脚本和true。这可以做到,虽然它有点乱,但它也不能解决实际问题,因为实际问题不是你想象的那样。

正如@BroSlow所说,find ... -exec 不会因为命令返回错误状态(或向stderr输出内容)而停止。还有其他东西使find停止,因此覆盖退出状态不会解决问题。你需要找出实际的问题,然后攻击它。

答案 2 :(得分:1)

这似乎没问题:

convert {} \; || true