Boru boyunca xargs kullanmanın bir yolu var mı?


15

Bir klasöre taşınan flac dosyalarını otomatik olarak başka bir klasördeki mp3'e dönüştürmeye çalışıyorum.

Geçerli kod satırım şudur:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test |  xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3

Bunun şu ana kadar nasıl çalıştığını açıklamak için, inotifywait oraya taşınan dosyaları izler ~ / sınama yolunu ve dosya adını bir boruya verir. xargs bu adı alır ve x'i dosya adıyla değiştirip dosyayı başka bir kanalda deşifre ederek uygun flac komutunu oluşturur. Yeni boru topalında flac'ın mp3 altında / medyaya çıkışı işlenir. Ben xargs ya boru bir şekilde ulaşmak, lame komutunda x yerine veya bir şekilde her iki komut erişebilir bir değişken veya bir şey göndermek istiyorum. Adlandırılmış kanallar ve bu caz ile uğraşmayı denedim, ancak iki komut arasında gerçek verilerin aktarıldığı gerçeği beni kafamın üstünde tutuyor.

Yanıtlar:


16

Doğru anlıyorsam, flac … | lame …her giriş satırı için bir örnek başlatmak ve girdiyi her iki komutun argümanlarına enterpolasyonlamak istersiniz .

xargsBir boru hattı başlatmanız gerektiğinden , boru hattı oluşturabilen bir program, yani bir kabuk oluşturabilen bir program başlatması gerekir.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
xargs -l sh -c 'flac -cd "$0" - | lame -b 320 - "/media/1tb/$0.mp3"'

Alternatif olarak, çağıran kabuğun satırları tek tek okumasını ve boru hattını çalıştırmasını sağlayın.

inotifywait -m -r -q -e moved_to --format "%w%f" ~/test |
while IFS= read -r file; do
  flac -cd "$file" - | lame -b 320 - "/media/1tb/$file.mp3"
done

Biçimi olduğunu Not %w%fEğer prepending olduğunuz için mutlak bir yol, üreten /media/1tbve ekleme .mp3. Eğer dosyanın dizin bölümünü kapalı şerit istiyorsanız lamekomuta, değişim $fileiçin ${file##*/}. Eğer değişiklik uzantısını kapalı şerit istiyorsanız $fileiçin ${file%.*}. Her ikisini de yapmak istiyorsanız, iki adımda yapmanız gerekir. Altında dizin hiyerarşisini yeniden oluşturmak /media/1tbistiyorsanız kullanabilirsiniz mkdir -p.

cd ~/test
inotifywait -m -r -q -e moved_to --format "%w%f" . |
while IFS= read -r file; do
  [ -f "$file" ] || continue; # skip directories and other special files
  dir=${file%/*}; file=${file##*/}
  mkdir -p "/media/1tb/$dir"
  flac -cd "$dir/$file" - | lame -b 320 - "/media/1tb/$dir/${file#.*}.mp3"
done

3

Şöyle bir şey deneyebilirsiniz:

inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test \
    | while read x; do \
        flac -cd "$x" - | lame -b 320 - "/media/1tb/$x.mp3"
    done;

1
while read …bir çözümdür, ama sonra düşer xargs. Yazdıklarınız mantıklı değil: sence xargsgirdisini nereden alıyor? Ve işleri düzgün bir şekilde alıntılamalısınız, müzik dosya adlarının boşluk içermesi yaygındır.
Gilles 'SO- kötü olmayı kes'

@Gilles Bana OP'nin tam olarak ne yaptığını açık değildi / net değil, bu yüzden "şöyle bir şey deneyebilirsin " ve "xargs bitinin niyetlerinize uygun olup olmadığından emin değilim" dedim. Bence en iyi cevap değil, doğru yönde bir ipucu. Alıntılama sorununu çözdüler ve xargs kaldırıldı.
goldilocks
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.