C'è un modo per usare xargs attraverso una pipe?


15

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 - /media/1tb/x.mp3

Per spiegare come funziona finora, inotifywait monitor ~ / test ricorsivamente per i file spostati lì, esponendo il percorso e il nome del file in una pipe. xargs prende quel nome e crea il comando flac corretto, sostituendo x con il nome file e decodificando il file in un'altra pipe. Nel nuovo pipe lame elabora l'output di flac in mp3 in / media. Voglio che xargs raggiunga attraverso la pipe in qualche modo, sostituendo la x nel comando lame o in qualche modo inviarlo a una variabile a cui entrambi i comandi possono accedere o qualcosa del genere. Ho provato a scherzare con le named pipe e quel jazz, ma il fatto che ci siano dati effettivi inviati tra i due comandi mi ha messo in difficoltà.

Risposte:


16

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

Dal momento che è necessario xargsavviare una pipeline, è necessario farlo avviare 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 - "/media/1tb/$0.mp3"'

In alternativa, fare in modo che la shell chiamante legga le righe una per una ed esegua 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 - "/media/1tb/$file.mp3"
done

Si noti che il formato %w%fproduce un percorso assoluto, al quale si sta anteponendo /media/1tbe accodando .mp3. Se si desidera eliminare la parte della directory del file nel lamecomando, passare $filea ${file##*/}. Se si desidera eliminare l'estensione, passare $filea ${file%.*}. Se vuoi fare entrambe le cose, dovrai farlo in due passaggi. Se si desidera riprodurre la gerarchia di directory in /media/1tb, è possibile utilizzare 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

Potresti provare qualcosa del tipo:

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 …è una soluzione, ma poi, rilascia xargs. Quello che hai scritto non ha senso: dove pensi che xargsstia ottenendo il suo contributo? E dovresti citare le cose correttamente, è comune che i nomi dei file musicali contengano spazi.
Gilles "SO - smetti di essere malvagio" il

@Gilles Non era / non è chiaro per me esattamente cosa sta facendo l'OP, motivo per cui ho detto "potresti provare qualcosa del genere " e "Non sono sicuro che il bit xargs sia fedele alle tue intenzioni" ecc. Quindi non credo sia la risposta migliore, ma un suggerimento nella giusta direzione. Risolto il problema di quotazione e rimosso xargs.
Riccioli d'oro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.