Bir -exec
komut a ile sonlandırılmalıdır ;
(bu nedenle genellikle yazmanız \;
veya ';'
kabuk tarafından yorumlanmasından kaçınmanız gerekir ) veya a +
. Fark şudur ki ;
, komut dosya başına bir kez +
çağrılır, mümkün olduğunca az kez çağrılır (genellikle bir kez, ancak bir komut satırı için maksimum uzunluk vardır, bu yüzden bölünebilir) tüm dosya adlarıyla . Bu örneğe bakın:
$ 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
Komutunuzun iki hatası var:
İlk olarak, kullanın {};
, ancak ;
kendi başına bir parametre olmalıdır.
İkincisi, komut &&
. “Run find komutunu belirttiniz ve bu başarılı olduysa {};
.” Adlı dosyayı kaldırın . Komutta kabuk şeylerini kullanmak istiyorsanız -exec
, bunu açıkça bir kabukta çalıştırmanız gerekir.-exec sh -c 'ffmpeg ... && rm'
.
Ancak {} 'i bash komutunun içine eklememelisiniz, özel karakterler olduğunda sorunlara neden olur. Bunun yerine, sonradan kabuğa ek parametreler iletebilirsiniz -c command_string
(bkz. man sh
):
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
Gördüğünüz gibi $
ilk örnekte bu şey kabuk tarafından değerlendirilir. $(rm -rf /)
:-) adlı bir dosya olduğunu düşünün
(Yan not: Bu -
gerekli değildir, ancak komuttan sonraki ilk değişken $0
, normalde çalıştırılan programın adını içeren ve bunu bir parametreye ayarlamak özel bir değişken olan değişkene atanır , ancak kazanılmış olsa da muhtemelen burada herhangi bir zarara yol açmaz, bu yüzden bunu sadece -
başlatacağız ve başlayacağız $1
.)
Yani emriniz şöyle bir şey olabilir
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' - {} \;
Ama daha iyi bir yol var. destekleri bulmak and
ve or
böylece gibi şeyler yapabilirsiniz find -name foo -or -name bar
. Ancak bu -exec
, komut başarılı bir şekilde çıkarsa true değerini ve değilse false değerini değerlendirir. Bu örneğe bakın:
$ ls
false true
$ find * -exec {} \; -and -print
true
Yalnızca komut başarıyla gerçekleştirildiyse yazdırır, true
ancak bunu gerçekleştirir, ancak yapmaz false
.
Böylece, bir ile zincirlenmiş iki exec deyimini kullanabilirsiniz -and
ve ikincisi sadece birincisi başarılı bir şekilde çalıştırıldıysa çalıştırılır.