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 xargs
manual. 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
xargs
en 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.mov
afolder/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
xargs
en combinación con find es que se pasarán varios nombres de archivo a la misma invocación de programa de cualquier programa que sexargs
inicie. Por ejemplo, sifind
devuelve los archivos foo , bar y baz , lo siguiente se ejecutarámv
solo una vez:Efectivamente, se llama
mv
así: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.sh
y 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
ffmpeg
con 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
basename
y usandosh -c
El -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
xargs
parámetros en unxargs
comando.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 array
argumento 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