在this问题答案是
find . -type f -name \*.mp4 -exec sh -c 'ffprobe "$0" 2>&1 |
grep -q 1920x1080 && echo "$0"' {} \;
这将输出所有 1920x1080
的 mp4 文件。
我不明白为什么 sh -c
在那里。如果我删除它,那么它什么也找不到。
作者说
The new shell is required to handle the flow control inside the exec'd command.
但我想我缺少一些理解答案的基础知识。
问题
谁能解释为什么 sh -c
必须存在,以及为什么只有当 ffprobe
在新的 shell 中打开时它才有效?
最佳答案
-exec 选项接受一系列参数:
find . -exec arg0 arg1 arg2 ... \;
如果你把参数放在引号里
find . -exec "arg0 arg1 arg2" \;
然后“arg0 arg1 arg2”被视为单个参数。它会期望一个名为 arg0 arg1 arg2
的命令存在于您的系统中,而不是一个名为 arg0
且参数为 arg1
的命令> 和 arg2
。
如果您在不使用 sh -c
的情况下使用 find,那么您将拥有:
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 {} \;
但不是单独的脚本,所有内容都在一行上。
关于linux - Bash 中的流量控制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509373/