¿Hay alguna forma de usar xargs a través de una tubería?

15

Estoy tratando de convertir automáticamente archivos FLAC movidos a una carpeta en mp3 en otra carpeta.

Mi línea actual de código es esta:

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

Para explicar cómo funciona esto hasta ahora, inotifywait monitorea ~ / prueba de forma recursiva para archivos movidos allí, enviando la ruta y el nombre de archivo a una tubería. xargs toma ese nombre y crea el comando flac adecuado, reemplazando x con el nombre del archivo y decodificando el archivo en otra tubería. En el nuevo pipe lame procesa la salida de flac en mp3 bajo / media. Quiero que xargs llegue a través de la tubería de alguna manera, reemplazando la x en el comando lame o de alguna manera la envíe a una variable a la que ambos comandos puedan acceder o algo así. Traté de jugar con las canalizaciones con nombre y ese jazz, pero el hecho de que haya datos reales que se canalizan entre los dos comandos me ha dejado muy en claro.

sagev9000
fuente

Respuestas:

16

Si entiendo correctamente, desea activar una instancia flac … | lame …para cada línea de entrada e interpolar la entrada en los argumentos de ambos comandos.

Como necesita xargscomenzar una tubería, debe hacer que inicie un programa que sea capaz de crear tuberías, es decir, un 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"'

Alternativamente, haga que el shell de llamada lea las líneas una por una y ejecute la tubería.

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

Tenga en cuenta que el formato %w%fproduce una ruta absoluta, a la que está anteponiendo /media/1tby agregando .mp3. Si desea quitar la parte del directorio del archivo en el lamecomando, cambie $filea ${file##*/}. Si desea quitar la extensión, cambie $filea ${file%.*}. Si quieres hacer ambas cosas, tendrás que hacerlo en dos pasos. Si desea reproducir la jerarquía de directorios bajo /media/1tb, puede usar 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- deja de ser malvado'
fuente
3

Podrías probar algo como:

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;
encerrada dorada
fuente
1
while read …Es una solución, pero luego, soltar xargs. Lo que escribiste simplemente no tiene sentido: ¿dónde crees que xargsestá obteniendo su entrada? Y debe citar las cosas correctamente, es común que los nombres de archivos de música contengan espacios.
Gilles 'SO- deja de ser malvado'
@Gilles No estaba / no está claro para mí exactamente qué está haciendo el OP, por eso dije "podrías intentar algo como " y "No estoy seguro de si el bit xargs es fiel a tus intenciones", etc. Así que no es la mejor respuesta, sino una pista en la dirección correcta, creo. Han solucionado el problema de las citas y eliminado xargs.
Ricitos de oro