find:缺少-exec的参数

时间:2010-06-02 21:19:26

标签: bash shell find arguments exec

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

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

shell返回

find: missing argument to `-exec'

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

我很感激你的帮助。

11 个答案:

答案 0 :(得分:302)

-exec命令必须以;终止(因此您通常需要键入\;';'以避免shell解释)或{{1 }}。区别在于使用+,每个文件调用一次命令;,它被调用的次数尽可能少(通常一次,但命令行有一个最大长度,因此它可能会被拆分)所有文件名。见这个例子:

+

您的命令有两个错误:

首先,您使用$ 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 ,但{};必须是自己的参数。

其次,命令以;结束。您指定了“运行查找,如果成功,请删除名为&&的文件”。如果要在{};命令中使用shell内容,则需要在shell中显式运行它,例如-exec

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

man sh

在第一个示例中,您看到$ ls $(echo damn.) $ find * -exec sh -c 'echo "{}"' \; damn. $ find * -exec sh -c 'echo "$1"' - {} \; $(echo damn.) 事件由shell评估。想象一下,有一个名为$的文件: - )

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

所以你的命令可能就像

$1

但还有更好的方法。找到支持find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \; and,这样您就可以执行or之类的操作。但这也适用于find -name foo -or -name bar,如果命令成功退出,则计算结果为true,否则计算结果为false。见这个例子:

-exec

如果命令成功,它只会运行打印,而$ ls false true $ find * -exec {} \; -and -print true 则执行此操作,但true没有。

所以你可以使用两个与false链接的exec语句,如果前者成功运行,它只会执行后者。

答案 1 :(得分:52)

我现在明白了。当你需要在一个find中的exec中运行两个命令时,你需要实际拥有两个独立的exec。这最终对我有用。

find . -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 \; -exec rm {} \;

答案 2 :(得分:47)

尝试在每个\;之前放置一个空格;

作品:

find . -name "*.log" -exec echo {} \;

不起作用:

find . -name "*.log" -exec echo {}\;

答案 3 :(得分:7)

仅供参考:
我刚刚尝试在Cygwin系统上使用“find -exec”命令(在Windows上模拟的UNIX),并且似乎必须删除分号前面的反斜杠:
find ./ -name "blabla" -exec wc -l {} ;

答案 4 :(得分:2)

以防任何人看到类似的"缺少-exec args"在Amazon Opsworks Chef bash脚本中,我需要添加另一个反斜杠来逃避\;

bash 'remove_wars' do
  user 'ubuntu'
  cwd '/'
  code <<-EOH
    find /home/ubuntu/wars -type f -name "*.war" -exec rm {} \\;
  EOH
  ignore_failure true
end

答案 5 :(得分:2)

此外,如果其他人有“查找:缺少-exec参数”,这可能会有所帮助:

在某些贝壳中你不需要进行转义,即你不需要在“;”前面加上“\”。

find <file path> -name "myFile.*" -exec rm - f {} ;

答案 6 :(得分:1)

我认为你需要做一些逃避。

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

答案 7 :(得分:0)

{}和&amp;&amp;由于命令行扩展会导致问题。我建议尝试:

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

答案 8 :(得分:0)

您必须在{}\;之间留一个空格
因此,该命令将类似于:find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;

答案 9 :(得分:0)

对于使用GNU时遇到问题的其他人,请在Windows命令提示符下找到二进制文件。分号必须使用^

进行转义
find.exe . -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 ^;

答案 10 :(得分:-2)

如果你仍然“查找:缺少-exec参数”,请尝试将execute参数包装在引号中。

find <file path> -type f -exec "chmod 664 {} \;"