-exec 选项采用一系列参数:
find . -exec arg0 arg1 arg2 ... \;
如果您将参数放在引号中
find . -exec "arg0 arg1 arg2" \;
然后 "arg0 arg1 arg2" 被视为单个参数。它会期望arg0 arg1 arg2
在您的系统上存在一个名为 的命令,带有空格,而不是arg0
使用参数arg1
和调用的命令arg2
。
如果您要使用 find 而不使用sh -c
,那么您将拥有:
find . -type f -name \*.mp4 -exec 'ffprobe "{}" 2>&1 |
grep -q 1920x1080 && echo "{}"' \;
这意味着find
它将寻找一个名为 的命令ffprobe "$0" ....
,不传递任何参数——没有这样的命令。有一个名为 的命令ffprobe
,它接受参数,这就是您所需要的。一种可能性是做这样的事情:
find . -type f -name \*.mp4 -exec ffprobe '$0' 2>&1 |
grep -q 1920x1080 && echo '{}' \;
但是,这不起作用,因为输出重定向2>&1
以及管道|
和命令序列运算符的&&
处理方式都与您想要的不同。
为了解决这个问题,他们使用了另一个 shell。这类似于创建一个脚本来完成这项工作:
find . -type f -name \*.mp4 -exec myscript {} \;
但不是单独的脚本,而是所有内容都在一行中。