GNU/Linux >> Linux Esercitazione >  >> Linux

Qual è il modo di usare Xargs attraverso un tubo?

Sto cercando di convertire automaticamente i file flac spostati in una cartella in mp3 in un'altra cartella.

La mia attuale riga di codice è questa:

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

Per spiegare come funziona finora, inotifywait controlla in modo ricorsivo ~/test per i file spostati lì, emettendo il percorso e il nome del file in una pipe. xargs prende quel nome e crea il comando flac appropriato, sostituendo x con il nome del file e decodificando il file in un'altra pipe. Nella nuova pipe lame elabora l'output di flac in mp3 sotto /media. Voglio che xargs raggiunga in qualche modo la pipe, sostituendo x nel comando lame o in qualche modo lo invii a una variabile a cui entrambi i comandi possono accedere o qualcosa del genere. Ho provato a scherzare con pipe con nome e quel jazz, ma il fatto che ci siano dati effettivi trasmessi tra i due comandi mi ha infastidito.

Risposta accettata:

Se ho capito bene, vuoi attivare un'istanza flac … | lame … per ogni riga di input e interpolare l'input negli argomenti di entrambi i comandi.

Dal momento che hai bisogno di xargs per avviare una pipeline, devi fare in modo che avvii un programma in grado di creare pipeline, ovvero una shell.

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

In alternativa, chiedi alla shell chiamante di leggere le righe una per una ed eseguire la pipeline.

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

Nota che il formato %w%f produce un percorso assoluto, a cui stai anteponendo /media/1tb e aggiungendo .mp3 . Se vuoi rimuovere la parte della directory del file nel lame comando, cambia $file a ${file##*/} . Se vuoi rimuovere l'estensione, cambia $file a ${file%.*} . Se vuoi fare entrambe le cose, dovrai farlo in due passaggi. Se vuoi riprodurre la gerarchia delle directory in /media/1tb , puoi usare 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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done

Linux
  1. Il modo migliore per gestire gli utenti su più server?

  2. Pipe output da usare come specifica di ricerca per grep su Linux

  3. Qual è il modo corretto di usare inotify?

  4. Posso usare avahi per pubblicare il servizio attraverso le sottoreti?

  5. Nohup funziona attraverso un tubo?

Fatti strada attraverso il tuo terminale Linux

Come utilizzare il comando xargs di Linux

Docker:come usarlo in modo pratico - Parte 3

Tubo da B a D? – A&&B || C | D?

Come usare il comando xargs in Linux?

Come usare l'ultimo Python 2.7.x nel modo giusto su Ubuntu 12.04 LTS?