Necesito convertir videos, pero no sé dónde están, así que los necesito find. ¿Cómo puedo dar el resultado y un nombre de archivo de salida para FFmpeg con xargs?
Ya descubrí que puedo construir los dos parámetros con este comando:
find . -iname "*.mov" -printf "%p %f\n"
No puedo encontrar nada relacionado en el xargsmanual. Quiero algo como esto:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
¿Cómo puedo hacer esto?
command-line
bash
xargs
command-line-arguments
kissgyorgy
fuente
fuente

xargsen general, pueden consultar stackoverflow.com/questions/3770432/… .Respuestas:
Algo como esto hará el truco y preservar la ruta completa, espacio de mango, de cambio de nombre
folder/movie.movafolder/movie.flv, etc.Y si te entendí mal y quieres todas las películas .flv en el directorio actual, usa esta en su lugar:
fuente
La razón por la que las personas usan
xargsen combinación con find es que se pasarán varios nombres de archivo a la misma invocación de programa de cualquier programa que sexargsinicie. Por ejemplo, sifinddevuelve los archivos foo , bar y baz , lo siguiente se ejecutarámvsolo una vez:Efectivamente, se llama
mvasí:Si no necesita o desea este comportamiento (como supongo que es el caso aquí), simplemente puede usar
find's-exec.En este caso, una solución fácil sería escribir un script de shell corto, como el siguiente:
Guardar como
myffmpeg.shy correrchmod +x myffmpeg.sh. Luego, ejecute lo siguiente:Esto invocará el script de shell una vez por cada archivo encontrado. El script de shell a su vez extrae el nombre del archivo de la ruta completa y llama
ffmpegcon los argumentos apropiados.fuente
No obtuve la solución que esperaba, así que descubrí la mía. @ La respuesta de Daniel es buena, pero necesita un script de shell. Un one liner es más rápido, y me gusta más :) también es una solución más simple que escribir un script.
Podría usar un argumento y procesarlo con
basenamey usandosh -cEl -i le dice a xargs que lo reemplace
{}con el argumento actual.La salida del comando dentro de `` se imprime en la salida estándar (función bash), por
basename {}lo que se evaluará como el nombre del archivo sin formato y se imprimirá.-0 para manejar nombres de archivos especiales correctamente, pero necesita pasar parámetros con la opción -print0 con find
fuente
Tienes que hacerlo como todas las respuestas, pero el uso EXACTO de xargs será algo como esto:
Entonces en tu caso será:
PD: Esto responde la pregunta sobre xargs para aquellos que buscan una respuesta exactamente para múltiples
xargsparámetros en unxargscomando.fuente
¿Por qué no simplemente mover las opciones de ffmpeg para que se ajusten al formato de los resultados del comando find ?
Observe la adición de la opción -r a xargs para evitar que ejecute ffmpeg si no se encuentran archivos .mov .
He agregado la opción -n2 a xargs para limitar la cantidad de elementos que xargs procesa a dos a la vez. En este caso, los elementos son la ruta del archivo y el nombre del archivo. Si no se establece la opción -n , xargs procesará tantos elementos de entrada como sea posible en una sola ejecución.
fuente
No estoy seguro de si puedes o cómo hacerlo con xargs.
Pero algo como esto debería funcionar para usted:
fuente
Una alternativa a la respuesta de Zoredache usando el enlace de nombre (y usando diferentes separadores para evitar el problema de espacios en los nombres de archivo):
Por supuesto, también puede usar los separadores con el
find -a arrayargumento que había usado la otra respuesta, pero a veces los argumentos nombrados son más comprensibles.fuente
Puede ejecutar ffmpeg directamente desde el comando find como este:
Tenga en cuenta las comillas alrededor de los parámetros para ffmpeg, en caso de que haya espacios en el nombre del archivo, y el punto y coma escapado marca el final del comando ejecutado.
fuente