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 find
Befehl:
find /home/jgeoffrey/Documents -type f -name "*.mov"
Sie suchen und iterieren über .mov
Dateien mithilfe der Variable f
. Der Wert der Variable $f
enthält also bereits .mov
die Datei. Angenommen, eine der Dateien ist foo.mov
.
Auch hier avconf
haben 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 $mp4
den Dateinamen, .mov
abgezogen und .mp4
ergä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 , while
anstelle von for
:
find .... | while IFS= read -r f; do .....