查找:-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文件。

295133 次浏览

我觉得你得逃跑。

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

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

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

{}和&&将由于被命令行展开而引起问题。我建议尝试:

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

-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.)

你可以看到$这个东西在第一个例子中是由shell计算的。假设有一个名为$(rm -rf /)的文件:-)

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

你的命令可以是这样的

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

但是有一个更好的办法。find支持andor,所以你可以做类似find -name foo -or -name bar的事情。但这也适用于-exec,如果命令成功退出,则返回true,否则返回false。请看这个例子:

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

它只在命令成功的情况下运行打印,它对true这样做,但对false没有。

因此,你可以使用两个exec语句与-and连接,如果前者成功运行,它只会执行后者。

试着在每个\;

工作原理:

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

不工作:

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

只为你的信息:
我刚刚尝试在Cygwin系统(Windows上模拟UNIX)上使用“find -exec”命令,似乎分号前的反斜杠必须被删除:
find ./ -name "blabla" -exec wc -l {} ; < / p >

为了防止有人在Amazon Opsworks Chef bash脚本中看到类似的“missing -exec args”,我需要添加另一个反斜杠来转义\;

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

同样,如果其他人有"find: missing argument to -exec",这可能会有所帮助:

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

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

如果您仍然得到“find: missing argument to -exec”,请尝试将execute参数括在引号中。

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

你必须在{}\;之间放一个空格

所以命令会像这样:

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

对于在使用GNU时遇到问题的其他人,请在Windows命令提示符中查找二进制文件。分号需要用^进行转义

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

在我的情况下,我需要执行“方法”;from by bash脚本,它在使用-exec bash -c时不起作用,所以我添加了另一个解决方案,我发现在这里,以及:

UploadFile() {
curl ... -F "file=$1"
}


find . | while read file;
do
UploadFile "$file"
done

当搜索为find中的每个文件执行命令的解决方案时,这个线程首先弹出,所以我希望这个解决方案没有使用-exec参数

当我在-exec命令的;结束后留下空白时,我得到了同样的错误。因此,删除;后的空白