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