今天我用一个命令得到了帮助,但它似乎没有起作用。这是命令:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}\;
shell返回
find: missing argument to `-exec'
我基本上要做的是递归遍历目录(如果它有其他目录)并在.rm
文件类型上运行ffmpeg命令并将它们转换为.mp3
文件类型。完成此操作后,删除刚刚转换的.rm
文件。
我很感激你的帮助。
答案 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 {} \;"