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 {} \;"