2016-09-13 5 views
0

Ich habe mehrere Ordner mit mehreren Videovorträgen. Die Namen der Dateien (Videos) sind wie topic blah blah blah - Lecture xx.mp4 Ich möchte sie in Lecture xx.mp4 umbenennenBash-Skript zum Umbenennen von Dateien

Ich habe das folgende Bash-Skript geschrieben. Und es scheint zu hängen (wird langsam) und gibt auch keine Ausgabe.

for file in *.mp4; do 
    echo "Renaming file :: $file" 
    nn=$(grep -o 'Lecture.[0-9]*' "$file") 
    echo $nn 
    #mv "$file" "$nn" 
done 

Bitte helfen Sie mir, dieses Skript zu korrigieren.

Antwort

2

Ihr Skript durchsucht den Inhalt der Datei (grep pattern [FILE...]), wenn Sie den $file Parameterwert tatsächlich ändern möchten. Dies sollte erklären, warum Ihr Befehl langsam ist und nicht zu funktionieren scheint.

Um den Wert des $file Parameter zu ändern, können Sie ein Bash-Funktion Parameter Erweiterungen (siehe man bash) genannt verwenden. In Ihrem Fall ${parameter##word}, das ist entfernen Sie passende Präfix Muster, kann verwendet werden. ${file##* - } wird die längste Übereinstimmung von * - strippen. Beachten Sie, dass * - kein regulärer Ausdruck, sondern ein Muster ist. Der Mustervergleich unterscheidet sich von regulären Ausdrücken (vergleiche * vs. .*).

#!/usr/bin/bash 

for file in *.mp4; do 
    new=${file##* - } 
    echo "Renaming '$file' to '$new'" 
    #mv "$file" "$new" 
done 
+0

Aber das 'blah blah blah' kann auch' -' Zeichen enthalten. – vvy

+1

Alternative, die die Abhängigkeit von Leerzeichen-Bindestrich vermeidet: 'new = $ {file/* Lecture/Lecture}' – John1024

+0

@John es funktioniert. @MichaWiedenmann vielen dank. Das Problem ist gelöst, aber kannst du bitte erklären, warum das 'nn = $ (grep -o 'Lecture. [0-9] *'" $ file ")' langsam und falsch ist. Ich habe auch "sed" auf die gleiche falsche Art und Weise versucht. – vvy

1

Sie könnten das Leben leichter mit dem rename Programm zu finden - es ist ein Perl-Skript ist. In Ihrem Fall würden Sie tun:

rename --dry-run 's/.*(Lecture \d+)/$1/' *mp4 

Ausgabe

'topic blah blah blah Lecture 01.mp4' would be renamed to 'Lecture 01.mp4' 
'topic blah blah blah Lecture 02.mp4' would be renamed to 'Lecture 02.mp4' 
'topic blah blah blah Lecture 555556.mp4' would be renamed to 'Lecture 555556.mp4' 

dann die --dry-run entfernen, wenn Sie mögen, was es sagt. Es hat gegenüber den meisten Ad-hoc-Shell-Skripten den Vorteil, dass es keine Dateien überfällt und Sie Trockenläufe ausführen können. Es unterstützt die vollständige Perl-Syntax, so dass Sie sehr komplizierte Dinge einfach ausführen können.

+0

scheint nützlich, danke. – vvy