El script agrega la extensión dos veces

El script agrega la extensión dos veces

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 findmando:

find /home/jgeoffrey/Documents -type f -name "*.mov"

está buscando e iterando sobre .movarchivos usando variables f. Entonces el valor de la variable $fya contiene .movel archivo. Por ejemplo, digamos que uno de los archivos es foo.mov.

Nuevamente, avconfha 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 $mp4ya contiene el nombre del archivo .moveliminado y .mp4agregado.

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 .....

información relacionada