find:缺less参数到-exec

今天我得到了一个命令,但是似乎并没有工作。 这是命令:

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

shell返回

 find: missing argument to `-exec' 

我基本上试图做的是通过一个目录recursion(如果它有其他目录),并运行ffmpeg命令的.rm文件types,并将其转换为.mp3文件types。 完成此操作后,请删除刚刚转换的.rm文件。

我感谢任何帮助。

一个-exec命令必须以一个; (所以你通常需要input\;';'来避免shell的解释)或a + 。 不同的是, ,每个文件调用该命令一次,使用+ ,它被称为只有尽可能less的次数(通常是一次,但有一个命令行的最大长度,所以它可能会分裂)与所有文件名。 看到这个例子:

 $ 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 

你的命令有两个错误:

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

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

但是,您不应该在bash命令中添加{},这会在有特殊字符时产生问题。 相反,您可以在-c command_string之后将其他parameter passing到shell(请参阅man sh ):

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

您会看到$ thing在第一个示例中由shell评估。 想象一下有一个名为$(rm -rf /) 🙂

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

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

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

但是有一个更好的方法。 find支持and和,所以你可以做一些像find -name foo -or -name bar 。 但是,这也适用于-exec ,如果该命令成功退出,则执行该操作,如果不成功则返回false。 看到这个例子:

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

只有在命令成功的情况下,它才会执行打印,这是为了true而不是false

所以你可以使用两个和-d关联的exec语句,如果前者成功运行,它将只执行后者。

我现在知道了 当你需要在exec中运行两个命令时,你需要实际上有两个独立的exec。 这终于为我工作。

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

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

作品:

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

不起作用:

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

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

为了防止任何人在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参数到-exec”,这可能会有所帮助:

在一些shell中,你不需要进行转义,即你不需要“;”前面的“\”。

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

你需要做一些逃避我想。

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

由于被命令行扩展,{&和&&都会导致问题。 我会build议尝试:

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

如果你仍然在“find:缺less参数到-exec”,请尝试将引号中的execute参数包装起来。

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