一個-exec
命令必須以;
終止(所以你通常需要輸入\;
或3210以避免由外殼解譯)或+
。與;
不同的是,該命令在每個文件中被調用一次,其中+
被調用的次數儘可能少(通常只有一次,但命令行有最大長度,因此可能會被分割)所有文件名。看到這個例子:
$ 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.)
你看$
事情是由第一個例子中的殼評估。想象一下,有一個叫做$(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
的東西。但是,這也適用於-exec
,如果該命令成功退出,則計算結果爲true;如果不成功,則計算結果爲false。看到這個例子:
$ ls
false true
$ find * -exec {} \; -and -print
true
它只能運行打印命令是否成功,它沒有爲true
而不是false
。
因此,您可以使用兩個與-and
鏈接的exec語句,如果前者成功運行,它將僅執行後者。
不確定是否會得到要刪除的文件的變量?任何人都知道是否是這種情況? – Abs 2010-06-02 21:46:08
要測試這樣的事情,只需在命令前面加一個'echo',看看它做了什麼。 – Marian 2010-06-02 22:22:36