Soy relativamente nuevo en Bash y estoy tratando de hacer algo que en la superficie parecía bastante sencillo: ejecutar find en una jerarquía de directorios para obtener todos los archivos * .wma, canalizar esa salida a un comando donde los convierto a mp3 y guarde el archivo convertido como .mp3. Pensé que el comando debería tener el siguiente aspecto (he dejado el comando de conversión de audio y en su lugar estoy usando echo como ilustración):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
Según tengo entendido, el argumento -print0 me permitirá manejar nombres de archivos que tienen espacios (que muchos de estos hacen como archivos de música). Entonces espero (como resultado de xargs) que cada ruta de archivo de find se capture en f, y que usando la coincidencia / eliminación de la subcadena desde el final de la cadena, debería hacer eco de la ruta de archivo original con un mp3 extensión en lugar de wma. Sin embargo, en lugar de este resultado, estoy viendo lo siguiente:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Entonces, mi pregunta (aparte del 'qué estoy haciendo mal aquí') es esta: los valores que son el resultado de una operación de tubería deben tratarse de manera diferente en las operaciones de manipulación de cadenas que los que son el resultado de una asignación variable ?
{}
miembro)
xargs
es más adecuado que exec
. Vea este stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs para ver un caso en cuestión.
xargs
confind
. Viene con una-exec
opción. ¿Puedes agregar el comando que vas a usar a tu pregunta y alguien puede mostrarte elfind
comando correcto ?