我需要在目录中递归查找一种类型的文件。然后为每个文件找到执行脚本,找到文件作为参数:
#!/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"没有参数。我做错了什么?
答案 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