es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Dónde está el error en este script Bash de una sola línea?

Tengo dos archivos .mp4 idénticos en un directorio. Por razones que no comprendo, el nombre de archivo del segundo archivo se corrompe por el script a continuación. Cuando tengo más archivos .mp4, los dos o tres primeros caracteres de cada otro archivo parecen eliminarse. Esto se ha probado con diferentes archivos .mp4 y en varios sistemas. Si elimino el -printf '%P\n' o no utilizo ffmpeg, funciona como se espera.

$ ls -l
total 46944
-rw-rw---- 1 ubuntu ubuntu 24034673 Dec 23 09:59 file_one.mp4
-rw-rw---- 1 ubuntu ubuntu 24034673 Dec 23 09:59 file_two.mp4
$ find . -name '*.mp4' -printf '%P\n' |while read -r FILE; do ffmpeg -loglevel error -y -i "$FILE" -ss 00:00:01.000 -vframes 1 junk.png; done
le_two.mp4: No such file or directory
$

¿Por qué se produce el error le_two.mp4: No such file or directory?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El error le_two.mp4: No existe el archivo o el directorio se produce debido a la forma en que se utiliza el comando find en el script. La opción -printf '%P\n' imprime la ruta relativa de cada archivo .mp4 en el directorio. Esto significa que cuando se ejecuta el bucle while después del comando find, la variable $FILE solo contiene el nombre del archivo, sin la ruta del directorio.

    En el caso del segundo archivo, file_two.mp4, su nombre de archivo se corrompe a le_two.mp4 porque los primeros dos caracteres, fi, se eliminan debido a un error en el script. Cuando se ejecuta el comando ffmpeg para este archivo, falla porque no se especifica la ruta del archivo, lo que provoca el mensaje de error le_two.mp4: No existe el archivo o el directorio.

    Para solucionar este problema, debemos modificar el script para incluir la ruta del directorio en la variable $FILE. Una forma de hacer esto es utilizar la opción -print0 en lugar de -printf '%P\n' en el comando find, y la opción -d en el comando read para especificar el delimitador como el carácter nulo:

    find . -name '*.mp4' -print0 | while read -d '' -r FILE; do
      ffmpeg -loglevel error -y -i "$FILE" -ss 00:00:01.000 -vframes 1 junk.png
    done
    

    De esta manera, la variable $FILE contendrá la ruta completa de cada archivo, incluido el directorio, y el script debería funcionar como se espera.

Comments are closed.