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