bul: bağımsız değişken arkaplan eksik
Bir komut ile bugün yardım edildi, ama çalışıyor gibi görünmüyor. Bu komut:
find /home/me/download/ -type f -name "*.rm" -exec ffmpeg -i {} -sameq {}.mp3 && rm {}\;
Kabuk verir
find: missing argument to `-exec'
Ne ben temelde yapmaya çalıştığı geçmesi bir dizin özyinelemeli (eğer diğer dizinler) ve çalışma ffmpeg komut .rm
dosya türleri ve onları dönüştürmek için .mp3
dosya türleri. Bu yapıldıktan sonra, sadece dönüştürülmüş .rm
dosyasını kaldırın.
Bu konuda herhangi bir yardım takdir ediyorum.
CEVAP
-exec
komut ;
(genellikle \;
';'
kabuk tarafından interpretion önlemek için yazmanız gerekiyor) veya
tamamlanmalıdır. Farkı ile ;
komut çağrıldığında bir kez her dosya,
, denir gibi birkaç kat daha olası (genellikle bir kez, ama en fazla uzunluğu için bir komut satırı, bu yüzden olabilir split) ile tüm dosya adları. Örnek:
$ 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
Komutu iki hata vardır:
İlk olarak, {};
, kullanın ama ;
kendi başına bir parametre olmalı.
İkinci olarak, komut &&
biter. Eğer başarılı olursa, dosya Kaldır “çalıştırmak bulmak ve adlandırılmış {};
.“. belirtilen Eğer -exec
komut kabuk malzeme kullanmak istiyorsanız, açıkça bir kabuk, -exec sh -c 'ffmpeg ... && rm'
gibi çalıştırmanız gerekir.
Eklenti değil ancak {} bash komutu içinde, özel karakterler olduğunda sorunları üretecek. Bunun yerine, -c command_string
sonra kabuk (man sh
) ek parametreler iletebilirsiniz:
$ ls
$(echo damn.)
$ find * -exec sh -c 'echo "{}"' \;
damn.
$ find * -exec sh -c 'echo "$1"' - {} \;
$(echo damn.)
$
şey ilk örnekte kabuk tarafından değerlendirilir. Adı $(rm -rf /)
: -) düşünün bir dosya
(-
gerekli değildir, ama ilk değişken sonra komutu atanan değişkene $0
, hangi özel bir değişkendir normalde içeren programın adını olmayı çalıştırın ve ayarı Bu parametre biraz kirli ama olmaz zarar burada muhtemelen, bu yüzden ayarlamak için sadece -
başlangıç $1
.)
Komutu gibi bir şey olur yani
find -exec bash -c 'ffmpeg -i "$1" -sameq "$1".mp3 && rm "$1".mp3' {} \;
Ama daha iyi bir yolu yoktur. and
or
bir şeyler yapmak gerekebilir find -name foo -or -name bar
gibi destekler bulabilirsiniz. Ama o da eğer komut başarılı bir şekilde çıkılıyor eğer doğru ve yanlış olarak değerlendirilir; -exec
ile çalışır. Örnek:
$ ls
false true
$ find * -exec {} \; -and -print
true
Sadece eğer komutu true
için yaptığı başarılı olsaydı, ama false
için değil baskı.
Eğer eski başarıyla çalıştırıldı eğer iki exec tablolar ** 42, bir ve tek ikinci çalıştırır ile zincirleme kullanabilirsiniz.
İşlev olarak şablon bağımsız değişken ...
Bir mesele ile birden çok bağımsız değ...
Birden çok bağımsız değişken vs seçene...
Açısal HttpPromise: arasında `başarı`/...
En son bağımsız değişken bir kabuk geç...