SORU
2 HAZİRAN 2010, ÇARŞAMBA


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
2 HAZİRAN 2010, ÇARŞAMBA


-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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • tutvid

    tutvid

    19 AĞUSTOS 2006