gpt4 book ai didi

bash - 查找:缺少 -exec 的参数

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:21 28 4
gpt4 key购买 nike

我今天得到了一个命令的帮助,但它似乎没有用。这是命令:

find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}\;

shell 返回

find: missing argument to `-exec'

我基本上想做的是递归地遍历一个目录(如果它有其他目录)并对 .rm 文件类型运行 ffmpeg 命令并将它们转换为 .mp3 文件类型。完成后,删除刚刚转换的 .rm 文件。

最佳答案

A -exec命令必须以 ; 结尾(因此您通常需要键入 \;';' 以避免被 shell 解释)或 + .不同之处在于 ; ,每个文件调用一次命令,使用 + , 它被调用的次数尽可能少(通常是一次,但命令行有最大长度,因此它可能会被拆分)所有文件名。看这个例子:

$ cat /tmp/echoargs
#!/bin/sh
echo $1 - $2 - $3
$ find /tmp/foo -exec /tmp/echoargs {} \;
/tmp/foo - -
/tmp/foo/one - -
/tmp/foo/two - -
$ find /tmp/foo -exec /tmp/echoargs {} +
/tmp/foo - /tmp/foo/one - /tmp/foo/two

你的命令有两个错误:

首先,您使用 {}; ,但是 ;必须是它自己的参数。

其次,命令结束于&& .您指定“运行查找,如果成功,删除名为 {}; 的文件” .”。如果你想在 -exec 中使用 shell 东西命令,您需要在 shell 中显式运行它,例如 -exec sh -c 'ffmpeg ... && rm' .

但是你不应该在bash命令中添加{},当有特殊字符时它会产生问题。相反,您可以在 -c command_string 之后将其他参数传递给 shell。 (参见 man sh):

$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)

你看到 $ thing 在第一个例子中由 shell 求值。假设有一个名为 $(rm -rf /) 的文件:-)

(旁注:不需要 -,但命令后的第一个变量被分配给变量 $0,这是一个特殊变量,通常包含正在运行的程序的名称并将其设置为参数有点不干净,虽然它可能不会在这里造成任何伤害,所以我们将其设置为 - 并以 $1 开始。)

所以你的命令可能是这样的

find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;

但还有更好的方法。找到支持andor , 所以你可以做类似 find -name foo -or -name bar 的事情.但这也适用于 -exec ,如果命令成功退出则计算结果为 true,否则计算结果为 false。看这个例子:

$ ls
false true
$ find * -exec {} \; -and -print
true

它只在命令成功时运行打印,它为 true 做了但不适用于 false .

所以你可以使用两个与 -and 链接的 exec 语句, 只有前者运行成功才会执行后者。

关于bash - 查找:缺少 -exec 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38870781/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com