Organisieren Sie Ihre Linux-Dateien einfach mit diesen 5 Methoden zum Batch-Umbenennen

Erfahren Sie, wie Sie Dateien in Linux effizient umbenennen können, indem Sie verschiedene Methoden wie Bash-Skripte, sed, rename, zmv und mmv nutzen.
Einer der häufigsten Aufgaben für Neulinge in Linux ist das Umbenennen von Dateien in größeren Mengen. Wenn Sie mit einer Linux-Shell nicht vertraut sind, kann dies wie eine manuelle und zeitaufwändige Aufgabe erscheinen. Es gibt jedoch viele Möglichkeiten, den Prozess zu beschleunigen; Sie müssen nur wissen, welche Methode am besten ist.
Beispiel-Datei-Verschiebe-Aufgaben
Um jeden Ansatz zu demonstrieren, verwende ich zwei Beispiele, die gängige Umbenennungsaufgaben darstellen, die Sie möglicherweise durchführen möchten. Es gibt viele verschiedene Möglichkeiten, wie Sie Dateien umbenennen könnten, abhängig von ihren aktuellen Namen und dem, was Sie tatsächlich tun. Die beiden Beispielaufgaben, die ich verwenden werde, können helfen, die typische Nutzung jedes Tools zu veranschaulichen. Sie müssen jedoch das Tool Ihrer Wahl weiter erkunden, um zu verstehen, wie Sie es am besten für Ihre spezifischen Bedürfnisse verwenden können.
Herauszufinden, was Sie tatsächlich tun möchten, ist wahrscheinlich der schwierigste Teil des Umbenennens von Dateien in größeren Mengen. Überlegen Sie, welche Teile des Namens jeder Datei Sie möglicherweise löschen, welche Sie behalten und welche Sie in etwas anderes übersetzen möchten.
Die erste Aufgabe besteht darin, die Erweiterung aller übereinstimmenden Dateien im aktuellen Verzeichnis zu ändern. Zum Beispiel sollte das Ändern einer „.txt“-Erweiterung in „.md“ die Datei test-001.txt in test-001.md umbenennen und ANOTHER.txt in ANOTHER.md umbenennen. Sie sollte nur auf Dateien zutreffen, die mit „.txt“ enden.
Die zweite Aufgabe ist etwas komplizierter, um einige fortgeschrittenere Funktionen dieser Tools zu zeigen. Es sollte einen bestimmten Teil eines Dateinamens entfernen und alles andere intakt lassen. Es sollte auf alle Dateien rekursiv angewendet werden. Konkret suche ich nach allen Dateien der Form DDDD_something.ext und benenne sie in DDDD.ext um. Dabei sollte 1234_this-is-my-doc.doc in 1234.doc und docs/9999_about.txt in docs/9999.txt umbenannt werden.
1 Mit einer for-Schleife, Globbing und ParameterSubstitution
Dieser erste Ansatz verwendet mehrere Funktionen der bash-Shell, die viele andere Shells übernommen haben. Zunächst einmal ist da die bescheidene for-Schleife, die verwendet wird, um über eine Menge von Kandidatendateien zu iterieren. Zweitens identifiziert sie diese Dateien mithilfe eines Globs, einer Art Muster, das für das Dateinamens-Matching optimiert ist. Schließlich verwendet dieser Ansatz eine Syntax, die es Ihnen ermöglicht, Strings basierend auf bestimmten Mustern zu modifizieren, genannt Parameterersetzung.
Für die erste Aufgabe können Sie .txt-Erweiterungen in .md mit diesem Shell-Code ändern:
for file in ./*.txt;
do
mv -- "$file" "${file%.txt}.md";
doneDie for-Schleife iteriert durch alle Dateien, die dem Glob ./*.txt entsprechen. Dies erfasst alle Dateien im aktuellen Verzeichnis, die mit der „.txt“-Erweiterung enden.
Der Befehl innerhalb der for-Schleife verschiebt die Datei zu einem neuen Namen, den er mit dem % Operator generiert. Dieses Symbol entfernt von einem String den kürzesten Teil eines Musters, das das Ende davon übereinstimmt. In diesem Fall entfernt es „.txt“ vom Ende jedes Dateinamens und fügt dann „.md“ hinzu.
Alle Beispiele in diesem Artikel sind illustrativ und sollten nicht naiv in einer Produktionsumgebung verwendet werden. Für eine robuste Lösung sollten Sie überlegen, ob Ihre Dateien Sonderzeichen enthalten können—insbesondere Leerzeichen—und Sie sollten immer eine Backup-Politik haben, um gegen Fehler abzusichern.
Die zweite Aufgabe beginnt mit einem viel komplizierteren Glob-Muster, um sowohl Rekursion als auch eine breitere Anzahl von Dateien zu handhaben:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;
do
mv -- "$file" "${file//_*./.}";
doneDas ./**/ erweitert sich so, dass es das aktuelle Verzeichnis und alle untergeordneten Verzeichnisse bis zu jedem möglichen Level darunter erfasst. Das [[:digit:]] Muster entspricht einer einzelnen Ziffer, sodass vier in Folge, gefolgt von einem Unterstrich, unsere benötigten Dateien erfasst.
Stellen Sie sicher, dass Sie verstehen, welche Shell Sie verwenden, um diesen Befehl auszuführen und welche Globbing-Funktionen sie unterstützt.
Um rekursives Globbing in Bash 4+ zu aktivieren, stellen Sie sicher, dass Sie shopt -s globstar ausführen, entweder als einmaligen Befehl oder innerhalb Ihres Skripts. Unter Mac unterstützt die zsh-Shell standardmäßig rekursives Globbing.
2 Mit einer for-Schleife und sed
Eine weitere Option für den Befehl in Ihrer for-Schleife ist sed, der Stream-Editor. Das sed-Programm sollte auf jedem Linux verfügbar sein, einschließlich macOS.
for file in ./*.txt;
do
mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
doneDer Unterschied in dieser Version besteht darin, dass der Parameter.
Die Substitution wird durch Befehlsersetzung und einen Aufruf von sed ersetzt. Die $(...) Syntax bewirkt, dass der Befehl ausgeführt wird und seine Ausgabe an dieser Stelle ersetzt wird.
Der reguläre Ausdruck, der an sed übergeben wird, ersetzt den Wert "txt" am Ende jedes Dateinamens durch "md". Das $ im Muster stellt sicher, dass die Übereinstimmung am Ende eines Dateinamens erfolgt.
Bei der zweiten Aufgabe wird der reguläre Ausdruck sogar komplexer, obwohl der Grundansatz gleich bleibt:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;
do
mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(\..+)/\1\2/')";
doneBeachten Sie, dass die reguläre Ausdrucksyntax von sed Wiederholungsoperatoren wie {4} unterstützt, sodass Sie den ausführlicheren Ansatz im Glob-Muster vermeiden können.
Obwohl diese sed-Lösungen etwas länger als ihre Parameterersatz-Entsprechungen sind, können sie leserlicher sein, insbesondere für diejenigen mit einem Verständnis von regulären Ausdrücken und sed. Die Unterstützung für reguläre Ausdrücke sowie verschiedene andere Funktionen machen sed zu einer weitaus leistungsstärkeren Alternative. Für komplexe Anforderungen kann dies eine bevorzugte Option darstellen.
3 Verwendung des Rename-Befehls
Der Rename-Befehl ist ein Perl-Skript, das die Ausführung beliebiger Perl-Code unterstützt und für die Umbenennung von Dateien optimiert ist. Das bedeutet, dass es sehr leistungsstark ist, obwohl Sie es auf einem System installieren müssen, auf dem Perl verfügbar ist.
Nach der Installation ist der Rename-Befehl sehr einfach für einfache Aufgaben zu verwenden, wie die Erweiterungsumbenennung in unserem ersten Beispiel:
rename 's/\txt$/md/' ./*.txtBeachten Sie, dass der reguläre Ausdruck identisch mit dem in dem entsprechenden sed-Beispiel ist. Hier liegt der Vorteil jedoch in der Handhabung der Dateinamen-Eingaben durch rename. Das Programm wendet seine Substitution auf jedes Dateiname-Argument an, sodass die Verwendung eines Globs, das auf alle .txt-Dateien expandiert, bedeutet, dass Sie die Aufgabe mit einer Einzeile abschließen können.
Der Rename-Befehl unterstützt die -n/--dry-run Option, die ein Protokoll potenzieller Änderungen ausgibt, ohne tatsächlich Dateien umzubenennen. Dies ist ein hervorragendes Sicherheitsnetz, das ich empfehle, wo immer es möglich ist.
Für die zweite Aufgabe benötigen Sie auch nur einen Einzeilenbefehl, selbst wenn der reguläre Ausdruck etwas komplizierter ist.
rename 's/(\/\d{4})_.*(\..*)/$1$2/' ./**/*Beachten Sie erneut, dass dies die erweiterte Blog-Unterstützung für rekursive Verzeichnisse nutzt.
4 Verwendung von zmv mit zsh
Wenn Sie zsh verwenden, haben Sie eine weitere Option zur Hand, vorausgesetzt, Sie aktivieren sie zuerst. zmv ist eine Shell-Funktion, die wie eine vereinfachte Version von rename funktioniert. Sie müssen sie laden – entweder fallweise oder über ein Startskript wie .zshrc – mit diesem Befehl:
autoload zmvSobald sie aktiviert ist, können Sie zmv wie folgt aufrufen, um die erste Aufgabe auszuführen:
zmv -W '*.txt' '*.md'Im Gegensatz zu rename kehrt zmv zu Globbing anstelle von regulären Ausdrücken zurück, sodass es etwas weniger leistungsstark ist. Aber wie Sie an diesem Beispiel sehen können, ist es einfach zu bedienen; die -W Option vereinfacht die Syntax sogar noch über das Standardmaß hinaus.
Da es sich um eine Shell-Funktion handelt, hat zmv kein eingebautes Handbuch. Aber Sie können einige Informationen darüber über man zshcontrib erhalten. Beachten Sie insbesondere, dass es auch eine -n Option unterstützt, um einen Testlauf durchzuführen.
Da zmv zsh erfordert, profitiert es von der erweiterten Globbing-Unterstützung, die die Shell bietet, einschließlich der Rekursion in Unterverzeichnisse.
zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'Ohne Unterstützung für reguläre Ausdrücke ist dieses Muster etwas länger, aber immer noch sehr leserlich.
5 Verwendung von mmv
mmv steht für "multiple move" und ist ein weiteres Tool, das speziell für die Massenumbenennung von Dateien entwickelt wurde. Sie müssen es wahrscheinlich installieren, aber dies ist nur ein einfacher Fall von sudo apt install mmv (Ubuntu), sudo yum install mmv (RHEL/CentOS/Fedora), brew install mmv (Mac) oder das Äquivalent in Ihrem bevorzugten Paketmanager.
Nach der Installation können Sie das Tool verwenden, um Erweiterungen ganz einfach umzubenennen:
mmv '*.txt'#1.md
Der große Unterschied bei mmv ist, wie es mit Mustern und Übereinstimmungen umgeht. Neben den bekanntesten Platzhaltern unterstützt mmv auch einen ; Platzhalter, den Sie verwenden können, um beliebig viele Verzeichnisse zu erfassen, was die rekursive Natur der zweiten Aufgabe unterstützt:
mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'Beachten Sie auch, wie mmv Verweise auf Übereinstimmungen unterstützt, nicht über die typischen Klammern, sondern indem jedem einzelnen Platzhalter eine eindeutige Nummer zugewiesen wird. Dies gibt uns sieben verschiedene Übereinstimmungen im endgültigen Ersetzungsausdruck: eine für den führenden Pfad, der durch ; übereinstimmt, eine für jede der vier Ziffern, eine—#6—für beliebige Zeichen nach dem Unterstrich, die wir verwerfen, und eine für die Erweiterung, die auf dem Punkt folgt.
Aufgrund dieses Ansatzes könnte mmv für Aufgaben, die zu viele Platzhalter im ursprünglichen Muster beinhalten, zu umständlich sein. Aber bei Aufgaben wie dem häufigen Erweiterungstausch lässt es sich hinsichtlich Einfachheit und Lesbarkeit schwer schlagen.
Obwohl es viele Optionen zum massenhaften Umbenennen von Dateien in Linux gibt, braucht jede ihre Zeit, um sich daran zu gewöhnen. Ich empfehle, eine auszuwählen, die am ansprechendsten aussieht, und sich so gut wie möglich damit vertraut zu machen, wobei Sie großzügig die -n/--dry-run Option für die Werkzeuge nutzen, die sie unterstützen.
Wenn Sie ein Fan von regulären Ausdrücken sind, ist es schwer, ihre schiere Macht zu übertreffen, und ein Werkzeug wie rename wird Ihnen wahrscheinlich gut dienlich sein. Wenn Sie hingegen eher ein Shell-Guru sind, ein Zauberer mit Platzhaltern, wird Ihnen wahrscheinlich das Aussehen von zmv oder mmv gefallen. Aber diese Werkzeuge sind nur dann nützlich, wenn Sie die Z-Shell verwenden oder sie installieren und ihre eigenwillige Syntax lernen.
In der Zwischenzeit kann die Parameterersetzung überraschend mächtig sein, und Sie möchten vielleicht Ihr massenhaftes Umbenennen von Dateien wiederholen, sodass das Schreiben eines Shell-Skripts weitere Vorteile bietet. Letztendlich ist die Wahl Ihre, und jede dieser Optionen ist vorzuziehen gegenüber dem manuellen Umbenennen von Hunderten von Dateien über eine GUI. Das ist die Macht der Kommandozeile.
Bist du neugierig auf weitere Artikel wie Organisieren Sie Ihre Linux-Dateien einfach mit diesen 5 Methoden zum Batch-Umbenennen? Entdecke spannende Inhalte in der Kategorie Linux.

Schreibe einen Kommentar