-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 {} \;
但不是单独的脚本,而是所有内容都在一行中。