Answers:
甲-exec
命令需要与被终止;
(因此通常需要输入\;
或';'
由外壳避免解译)或+
。区别在于,with ;
,每个文件调用一次命令,with +
,调用所有文件名的次数尽可能少(通常一次,但是命令行有最大长度,因此可能会被拆分)。 。请参阅以下示例:
$ 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命令中添加{},否则在使用特殊字符时会产生问题。相反,您可以在之后将其他参数传递给shell -c command_string
(请参阅参考资料man sh
):
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
您将$
在第一个示例中看到事物是由外壳评估的。想象有一个名为$(rm -rf /)
:-) 的文件
(附带说明:-
不需要,但是命令后的第一个变量分配给了变量$0
,这是一个特殊变量,通常包含正在运行的程序的名称,并将其设置为参数有点不干净,尽管它赢得了可能不会在这里造成任何伤害,因此我们将其设置为just,-
然后从开始$1
。)
所以你的命令可能像
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
但是有更好的方法。找到支撑and
和or
,所以你可以做的东西一样find -name foo -or -name bar
。但这也适用于-exec
,如果命令成功退出,则结果为true,否则为false。请参阅以下示例:
$ ls
false true
$ find * -exec {} \; -and -print
true
它仅在命令成功执行的情况下运行打印,但命令不是成功true
的false
。
因此,您可以使用与链接的两个exec语句-and
,并且只有前者成功运行时,它才会执行后者。
"\;"
不起作用,但" \;"
可以起作用
我现在想通了。当您需要在exec中运行两个命令时,实际上需要有两个单独的exec。这终于对我有用。
find . -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 \; -exec rm {} \;
echo
在命令之前添加一个,然后查看它的作用。
echo
是相当不可靠的-你不能告诉之间的区别echo "one argument"
和echo one argument
(后者的输出是假的,因为它实际上是通过echo
两个完全独立的参数)。最好执行像这样的操作-exec bash -c 'printf "%q " "$@"' _ ffmpeg -i {} -sameq {}.mp3 \; -printf '\n'
,它将以使无法打印的字符可见的方式打印输出,以便您可以检测DOS换行符和其他异常。
尝试在每个\之前放置一个空格;
作品:
find . -name "*.log" -exec echo {} \;
不起作用:
find . -name "*.log" -exec echo {}\;
仅供参考:
我刚刚尝试在Cygwin系统(在Windows上模拟UNIX)上使用“ find -exec”命令,并且看来分号前的反斜杠必须删除:
find ./ -name "blabla" -exec wc -l {} ;
find /etc/nginx -name '*.conf' -exec echo {} ;
并find /etc/nginx -name '*.conf' -exec echo {}\;
给出了相同的结果。:(
{}
。
另外,如果其他任何人都有“ -exec的find:缺少参数”,这可能会有所帮助:
在某些shell中,您不需要转义,即,不需要在“;”前面的“ \”。
find <file path> -name "myFile.*" -exec rm - f {} ;
;
没有被引用或转义的意思是它可以被外壳使用,不能被读取find
。另外,-f
和- f
是两个不同的东西。
{}和&&都会由于命令行扩展而引起问题。我建议尝试:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i \{} -sameq \{}.mp3 \; -exec rm \{} \;
{}
变量以删除正确的文件?
{}
将扩展到什么?除非它包含两个点或逗号,否则将保持原样。
您必须在{}
和之间放置一个空格\;
因此,命令将类似于:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {} \;