Skript hängt Erweiterung zweimal an

Skript hängt Erweiterung zweimal an

Ich führe ein schnelles Bash-Skript aus, das alle MOV-Dateien in MP4-Dateien konvertiert. Das funktioniert in 99 % der Fälle einwandfrei, aber manchmal stoße ich auf ein Problem und erhalte die folgende Fehlermeldung:

die Datei /home/jgeoffrey/Documents/HomeMovie/Test/year1video.mov.mov Keine solche Datei oder kein solches Verzeichnis

Wie Sie sehen, wird die Dateierweiterung aus irgendeinem Grund zweimal an das Ende der Datei angehängt. Wenn ich zum eigentlichen Verzeichnis navigiere, ist das nicht der Fall, sie steht nur einmal da.

Was verursacht dies und wie behebe ich es? Unten ist das Skript:

#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

Antwort1

In Ihrem findBefehl:

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

Sie suchen und iterieren über .movDateien mithilfe der Variable f. Der Wert der Variable $fenthält also bereits .movdie Datei. Angenommen, eine der Dateien ist foo.mov.

Auch hier avconfhaben Sie die Eingabedatei als verwendet $f.mov, daher wird der Dateiname

foo.mov.mov 

Der Fehler besagt genau Folgendes:

Jahr1Video.mov.mov: Keine solche Datei oder Verzeichnis

Also brauchst du:

avconv -i "$f" -codec copy "$mp4"

enthält bereits $mp4den Dateinamen, .movabgezogen und .mp4ergänzt.

Setzen Sie auch Ihre Variable mit den Dateinamen in Anführungszeichen, da sonst bei Dateinamen mit Leerzeichen ein Fehler auftritt.

Verwenden Sie außerdem beim Durchlaufen einer durch Zeilenumbrüche getrennten Liste von Dateien , whileanstelle von for:

find .... | while IFS= read -r f; do .....

verwandte Informationen