Estoy ejecutando un script bash rápido que convertirá cualquier archivo .mov a .mp4. Esto funciona muy bien el 99% de las veces, pero a veces toco una trampa y aparece el error:
el archivo /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov No existe tal archivo o directorio
Como puede ver, la extensión del archivo se agrega, por alguna razón, dos veces al final del archivo. Si navego hasta el directorio real, ese no es el caso, solo aparece allí una vez.
¿Qué está causando que esto ocurra y cómo lo soluciono? A continuación se muestra el guión:
#Scanning Documents for any mov files
for f in $(find /home/jgeoffrey/Documents -type f -name "*.mov");
do
#checking if a .mp4 exists
mp4=${f%.mov}.mp4
#if no .mp4 exist convert the file
if ! lsof $f && [ ! -e "$mp4" ];
then
#Converting the file to .mp4
avconv -i $f.mov -codec copy $f.mp4
fi
done
Respuesta1
A tu find
mando:
find /home/jgeoffrey/Documents -type f -name "*.mov"
está buscando e iterando sobre .mov
archivos usando variables f
. Entonces el valor de la variable $f
ya contiene .mov
el archivo. Por ejemplo, digamos que uno de los archivos es foo.mov
.
Nuevamente, avconf
ha utilizado el archivo de entrada como $f.mov
, por lo que el nombre del archivo se convierte en
foo.mov.mov
Esto es exactamente lo que dice el error:
vídeo del año 1.mov.mov: El fichero o directorio no existe
Así que tú necesitas:
avconv -i "$f" -codec copy "$mp4"
ya que $mp4
ya contiene el nombre del archivo .mov
eliminado y .mp4
agregado.
También cite la variable que contiene nombres de archivos; de lo contrario, fallará en el caso de nombres de archivos con espacios en blanco.
Además, mientras recorre una lista de archivos separados por una nueva línea, utilice while
, en lugar de for
:
find .... | while IFS= read -r f; do .....