Ich suchte nach einer Möglichkeit, eine große Anzahl von Dateien mit ähnlichen Namen umzubenennen, ähnlich wie diese (eine Windows-bezogene Frage), außer dass ich * nix (Ubuntu und FreeBSD, getrennt) verwende. Um es zusammenzufassen: Wie benenne ich bei Verwendung der Shell (Bash, CSH usw.) eine Reihe von Dateien massenweise um, z. B. die folgenden Dateien:
Beethoven - Fur Elise.mp3
Beethoven - Mondscheinsonate.mp3
Beethoven - Ode an die Freude.mp3
Beethoven - Wut über den verlorenen Penny.mp3
wird so umbenannt?
Fur Elise.mp3
Moonlight Sonata.mp3
Ode an Joy.mp3
Wut über den verlorenen Penny.mp3
Der Grund, warum ich dies tun möchte, ist, dass diese Dateisammlung unter einem Verzeichnis mit dem Namen "Beethoven" (dh dem Präfix der Dateinamen) abgelegt wird und diese Informationen über den Dateinamen selbst redundant sind.
Wie so viele Dinge unter Linux / Unix gibt es mehr als einen Weg, dies zu tun!
Einige verwenden möglicherweise mmv (Masse mv).
Der Befehl zum Umbenennen oder Vornamen, der mit einigen Perl-Paketen (neueres Ubuntu und Debian) geliefert wird, kann dies ebenfalls tun.
Beachten Sie, dass das Umbenennungstool unter Fedora 10 nicht dasselbe Programm ist und anders funktioniert. Es ist Teil eines anderen Pakets, util-linux-ng und kann hier gefunden werden .
Ich gehe oft nur aus Gewohnheit zur Shell, um eine Schleife zu machen (nachdem solche Werkzeuge nicht immer existierten).
Dadurch wird das Beethoven-Verzeichnis erstellt und die Datei in das Verzeichnis / den Dateinamen verschoben, in dem der Dateiname das "Beethoven -" durch nichts ersetzt hat.
Als Test vor:
Nach:
quelle
Probieren Sie diese Lösung aus, die mit einer Kombination aus grep und rename implementiert wurde. Dies setzt voraus, dass Sie eine ganze Reihe von Verzeichnissen haben, die Sie umbenennen müssen. Wenn es nur wenige gibt, würde ich den manuellen Ansatz wählen, wobei das "Artist -" - Muster für jedes fest codiert ist.
Erläuterung von find :
Der Befehl find findet alle Dateien mit der Erweiterung .mp3 in der aktuellen Dateihierarchie und ruft das an jede übergebene Argument für -exec auf. Beachten Sie, dass innerhalb -exec , {} auf das Argument von geben verweist Fund (Dateipfad + Name). Die
\;
Sorgt für die;
wird übergeben benennen und stattdessen das Ende des von Anzeigen finden Befehl.Der oben angegebene Befehl hat den Schalter -n (keine Aktion). Daher wird es Ihnen nur sagen, was passieren würde, wenn Sie es ausführen würden. Ich empfehle, diesen Befehl ohne den Schalter -n erst auszuführen, nachdem Sie ihn einmal ausgeführt haben und mit den vorgeschlagenen Ergebnissen zufrieden sind.
Nun zum regulären Ausdruck.
^
entspricht dem Stringanfang.$
stimmt mit dem Ende der Zeichenfolge überein..
passt zu einem beliebigen Zeichen.*
bedeutet null oder mehr des vorhergehenden Konstrukts..*
bedeutet zB null oder mehr Zeichen.\s
steht für jedes Leerzeichen.\S
steht für jedes Nicht-Leerzeichen.()
wird erfasst und als reflektierte$1
,$2
in Abhängigkeit von seiner Position.Der reguläre Ausdruck:
(.*/)
-
":.*-
(.*)
Hier ist mein Testlauf:
Regexp's sind eine knifflige Angelegenheit, und ich habe so manche Fehler gemacht, als ich sie geschrieben habe. Daher würde ich jede Eingabe über den Mangel an Verdienst dieser begrüßen. Ich weiß, dass ich einige Tests gefunden habe.
quelle
Ich habe ein Java-Befehlszeilenprogramm zusammengestellt, mit dem das Umbenennen von Dateien (und Verzeichnissen) zum Kinderspiel wird, insbesondere für die Skripterstellung. Es ist kostenlos und Open Source, sodass Sie es nach Herzenslust ändern können:
RenameWand
http://renamewand.sourceforge.net/
Einige relevante Anwendungsbeispiele:
Verschieben Sie Dateien des Formulars
"<a> - <b>"
in das entsprechende Verzeichnis"<a>"
:Sortieren Sie die Dateien nach der zuletzt geänderten Zeit und benennen Sie sie mit einer dreistelligen Nummer um:
Ordnen Sie Teile des Dateinamens neu an und ändern Sie die Groß- und Kleinschreibung:
quelle
zmv
Das zsh-Umbenennungstool ist sehr gut.Weitere Notizen hier ...
quelle
Für Pinguinköpfe ist dies einfach in einem Shell-Skript oder AWK-Skript möglich. Für uns Sterbliche möchten Sie vielleicht Midnight Commander ausprobieren. Es ist auf den meisten Linux-Distributionen von einer Shell-Eingabeaufforderung vom Typ mc -a. Sie können Dateien mit regulären Ausdrücken umbenennen. Ich habe den Artikel unter GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/ verwendet , um mir zu helfen.
quelle
Hier ist ein einfaches Befehlszeilenbeispiel. Ich hatte das Wort "weiß" in der Mitte der Namen einer Reihe von PNG-Dateien. Ich wollte es herausnehmen und nur einen einzigen Unterstrich hinterlassen. Das hat den Trick gemacht:
quelle
Verwenden Sie vidir und verwenden Sie dann Ihre Editorfunktionen , um das Umbenennungsmuster anzuwenden.
quelle
Auf einem * nix ohne Perl
rename
verfügbarUnter einigen * nix ist keine Umbenennung verfügbar, daher muss die Umbenennung mit einer anderen Methode durchgeführt werden. Vor ein paar Jahren habe ich
zmv
hier vorgeschlagen , was zwar großartig ist, aber auch nicht unbedingt verfügbar ist.Mit Builtins und Sed können wir schnell ein Shell-Skript erstellen, das uns eine sehr ähnliche Syntax wie das Perl-Umbenennungsskript bietet.
Verwendung
Angenommen, wir wollten auch Zielordner erstellen ...
Da
mv
keine Ordner erstellt werden, die wir nicht verwenden können,sedrename
wie es hier ist, aber es ist eine ziemlich kleine Änderung, daher denke ich, dass es schön wäre, sie auch einzuschließen.Wir benötigen eine Dienstprogrammfunktion
abspath
(oder einen absoluten Pfad), damit wir die Zielordner für ein sed / rename-Muster generieren können, das eine neue Ordnerstruktur enthält.Dadurch wird sichergestellt, dass wir die Namen unserer Zielordner kennen. Wenn wir umbenennen, müssen wir es für den Namen der Zieldatei verwenden.
Hier ist das vollständige Ordner-fähige Skript ...
Natürlich funktioniert es immer noch, wenn wir auch keine bestimmten Zielordner haben.
Wenn wir alle Songs in einen Ordner legen wollten, können
./Beethoven/
wir dies tun:Verwendung
Bonusrunde ...
Verwenden dieses Skripts zum Verschieben von Dateien aus Ordnern in einen einzelnen Ordner:
Angenommen, wir wollten alle übereinstimmenden Dateien sammeln und im aktuellen Ordner ablegen, dann können wir Folgendes tun:
Hinweis zu sed regex-Mustern
In diesem Skript gelten die Regeln für reguläre sed-Muster. Diese Muster sind keine PCRE (Perl Compatible Regular Expressions). Sie hätten die erweiterte Syntax für reguläre Ausdrücke entweder
sed -r
odersed -E
abhängig von Ihrer Plattform verwenden können.man re_format
Eine vollständige Beschreibung der sed-Basis- und erweiterten Regexp-Muster finden Sie in der POSIX-Konformität .quelle