GNU/Linux >> Tutoriales Linux >  >> Linux

¿Alguna forma de usar Xargs a través de una tubería?

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

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

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

Para explicar cómo funciona esto hasta ahora, inotifywait monitorea ~/test recursivamente en busca de archivos movidos allí, enviando la ruta y el nombre del archivo a una canalización. xargs toma ese nombre y crea el comando flac apropiado, reemplazando x con el nombre del archivo y decodificando el archivo a otra canalización. En el nuevo canal, lame procesa la salida de flac en mp3 en /media. Quiero que xargs llegue a través de la tubería de alguna manera, reemplazando la x en el comando cojo o de alguna manera enviarlo a una variable a la que ambos comandos puedan acceder o algo así. Intenté jugar con las canalizaciones con nombre y ese jazz, pero el hecho de que se canalicen datos reales entre los dos comandos me tiene fuera de mi cabeza.

Respuesta aceptada:

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

Ya que necesitas xargs para iniciar una canalización, debe hacer que inicie un programa que sea capaz de crear canalizaciones, 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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$0.mp3"'

Alternativamente, haga que el shell que llama lea las líneas una por una y ejecute la canalización.

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

Tenga en cuenta que el formato %w%f produce una ruta absoluta, a la que está anteponiendo /media/1tb y agregando .mp3 . Si desea eliminar la parte del directorio del archivo en el lame comando, cambiar $file a ${file##*/} . Si desea eliminar la extensión, cambie $file a ${file%.*} . Si quieres hacer ambas cosas, tendrás que hacerlo en dos pasos. Si desea reproducir la jerarquía de directorios en /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 - "//eadn-wc01-5196795.nxedge.io/media/1tb/$dir/${file#.*}.mp3"
done

Linux
  1. Cómo usar tuberías y tuberías con nombre en Linux (con ejemplos)

  2. ¿Alguna forma de usar Windows Live Messenger en Ubuntu?

  3. ¿Cómo puedo usar comandos con alias con xargs?

  4. ¿Nohup funciona a través de una tubería?

  5. ¿Cómo canalizar la salida de grep a cp?

Serpentea tu camino a través de tu terminal Linux

Cómo usar el comando xargs de Linux

Docker:Cómo usarlo de manera práctica - Parte 3

Tubería B a D? – A &&B || C | ¿D?

¿Cómo usar el comando xargs en Linux?

¿Puedo usar la salida de tubería como un argumento de script de shell?