Apakah ada cara untuk menggunakan xargs di pipa?

15

Saya mencoba untuk secara otomatis mengonversi file flac yang dipindahkan ke folder menjadi mp3 di folder lain.

Baris kode saya saat ini adalah ini:

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

Untuk menjelaskan bagaimana ini bekerja sejauh ini, inotifywait monitor ~ / uji secara rekursif untuk file yang dipindahkan ke sana, mengeluarkan path dan nama file ke pipa. xargs mengambil nama itu dan membuat perintah flac yang tepat, mengganti x dengan nama file dan mendekode file ke pipa lain. Dalam proses lumpuh pipa baru output dari flac ke mp3 di bawah / media. Saya ingin xargs dapat menjangkau melintasi pipa dengan cara tertentu, mengganti x dalam perintah lumpuh atau dengan cara tertentu mengirimkannya ke variabel yang dapat diakses oleh kedua perintah atau sesuatu. Saya mencoba main-main dengan pipa bernama dan jazz itu tetapi fakta bahwa ada data aktual yang disalurkan antara dua perintah telah saya di atas kepala saya.

sagev9000
sumber

Jawaban:

16

Jika saya mengerti dengan benar, Anda ingin menjalankan satu instance flac … | lame …untuk setiap baris input, dan menginterpolasi input ke dalam argumen untuk kedua perintah.

Karena Anda perlu xargsmemulai saluran pipa, Anda harus membuatnya memulai program yang mampu membuat saluran pipa, yaitu sebuah shell.

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"'

Atau, minta shell panggilan membaca baris satu per satu dan jalankan pipeline.

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

Perhatikan bahwa format %w%fmenghasilkan jalur absolut, yang Anda prabayar /media/1tbdan tambahkan .mp3. Jika Anda ingin menghapus bagian direktori dari file dalam lameperintah, ubah $fileke ${file##*/}. Jika Anda ingin menghapus ekstensi, ubah $fileke ${file%.*}. Jika Anda ingin melakukan keduanya, Anda harus melakukannya dalam dua langkah. Jika Anda ingin mereproduksi hierarki direktori di bawah /media/1tb, Anda dapat menggunakan 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
Gilles 'SO- berhenti menjadi jahat'
sumber
3

Anda dapat mencoba sesuatu seperti:

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;
goldilocks
sumber
1
while read …adalah solusi, tetapi kemudian, drop xargs. Apa yang Anda tulis tidak masuk akal: di mana menurut Anda xargsmendapatkan inputnya? Dan Anda harus mengutip hal-hal dengan benar, itu umum untuk nama file musik mengandung spasi.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Tidak / tidak jelas bagi saya persis apa yang OP lakukan, itulah sebabnya saya mengatakan "Anda bisa mencoba sesuatu seperti " dan "Saya tidak yakin apakah bit xargs benar untuk niat Anda" dll Jadi bukan jawaban terbaik tapi petunjuk ke arah yang benar, saya pikir. Telah memperbaiki masalah penawaran dan menghapus xargs.
goldilocks