linux - Bash 中的流量控制是什么?

标签 linux bash

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/

相关文章:

bash - Bash 4.0.0 中 $@ 未绑定(bind)变量的解决方法?

c - 在 C 中是否有调用堆栈转储的函数?

linux - 将文件夹权限更改为管理员

linux - 运行 linux 命令以显示已安装的应用程序和所有权详细信息

linux - 将文件从 Suse 服务器移动到 ftp 的 FTP 脚本

bash - Grep spotify songname 从 html doc 到文本文件

regex - Linux - 想要检查可能的重复目录(可能需要 RegEx)

linux - 在 Linux 中, "top"命令中的所有值是什么意思?

c - GCC 4 中的 in6_addr

mysql - Bash 恢复数据库 MySQL