Mv: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
K →rename |
||
Zeile 141: | Zeile 141: | ||
== rename == | == rename == | ||
[[Linux:Befehl:rename]] | |||
rename | |||
== prename == | == prename == |
Version vom 19. Februar 2022, 12:58 Uhr
mv verschiebt oder benennt Dateien und Verzeichnisse um
Syntax
mv [OPTION]... [-T] QUELLE... ZIEL
Optionen
Zeichen | Beschreibung |
---|---|
--backup[=STRG] | vor Entfernen Sicherung anlegen |
-b | wie --backup, akzeptiert aber keine Argumente |
-f, --force | vor Überschreiben nicht nachfragen |
-i, --interactive | vor Überschreiben nachfragen |
-n, --no-clobber | bestehende Dateien nicht überschreiben |
-S, --suffix=SUFFIX | die normale Sicherungs‐Erweiterung überschreiben |
--target-directory=VERZ | alle Quellen in Verzeichnis VERZ verschieben |
-T, --no-target-directory | ZIEL als normale Datei behandeln |
-u, --update | nur solche Dateien verschieben, die neuer als die entsprechende Datei im Zielverzeichnis sind oder die dort noch nicht existieren |
-v, --verbose | Erklärung über Abläufe ausgeben |
- Wenn mehr als eine Option von -i, -f und -n angeben wird, so gilt die letzte.
- Die Standardendung für Sicherheitskopien ist ~.
Mögliche Werte für die Sicherheitskopienerstellung (--backup) sind:
Steuerung | Beschreibung |
---|---|
none, off | Niemals Sicherheitskopien erstellen (selbst wenn --backup angegeben wurde) |
numbered, t | Erstellen von nummerierten Sicherheitskopien |
simple, never | Immer einfache Sicherheitskopien erstellen |
existing, nil | Nummeriert (»numbered«), wenn nummerierte Sicherheitskopien existieren, sonst einfach (»simple«) |
Hinweis
mv aktualisiert nicht die Metadaten der Dateien.
Anwendungen
Dateien umbenennen
Datei alt.txt in neu.txt umbenennen:
mv alt.txt neu.txt
Dateien verschieben
Dateien a.txt, b.txt und c.txt in den Ordner meine_daten verschieben:
mv a.txt b.txt c.txt meine_daten
Verzeichnis verschieben
Verzeichnis a in Verzeichnis b verschieben:
mv a b
Mit Verzeichnis a das leere Verzeichnis b ersetzen:
mv -T a b
Dateien verschieben (mv)
(move) Umbenennen einer Datei unter Einbeziehung des gesamten Dateipfades.
- Neben reiner Namensänderung auch ein Verschieben in ein anderes Verzeichnis möglich (Änderung der Verzeichniseinträge, kein Kopieren).
- Ist die Datei Ziel bereits vorhanden, wird sie überschrieben.
- Liegt die Datei auf einen anderen Datenträger, wird sie physikalisch kopiert und an der alten Stelle gelöscht. Ein Verzeichnis kann nicht über die Grenzen eines Dateisystems hinweg verschoben werden.
mv [Optionen] Quelle Ziel
mv [Optionen] Quelle ... Verzeichnis
Optionen
-b | sichert Dateien vor dem Überschreiben |
-f | überschreibt existierenden Zieldateien rücksichtslos |
-i | erwartet interaktiv eine Bestätigung vor dem Überschreiben existierender Zieldateien |
-u | verschiebt Dateien nur, wenn sie neuer sind als die gleichnamigen Zieldateien |
-v | meldet jede Aktion |
-S Endung | bestimmt die Endung für einfaches Backup; Voreinstellung ist `~' |
- Der Anhang für Sicherheitskopien ist ~, außer wenn er --suffix oder SIMPLE_BACKUP_SUFFIX gesetzt wurde. Die Versionskontrolle kann mit --backup oder VERSION_CONTROL gesetzt werden.
- Mögliche Werte sind:
none, off | Niemals Sicherung erzeugen (selbst wenn --backup angegeben wurde) |
numbered, t | Erzeugen von nummerierten Sicherheitskopien |
existing, nil | Nummeriert wenn nummerierte Backups existieren, sonst einfach. |
Simple, never | Immer einfache Sicherheitskopien erzeugen |
Dateien umbenenen
mv
- Um Dateien in Linux umzubenennen verwendet man (bei einer Datei) einfach:
mv dateiname.ext dateinameNeu.ext
- Wenn man jedoch mehrere Dateien umbenennen will, muss man zu einem kleinen Hilfsmittel greifen. mv kann nur mit einer Destination arbeiten.
- Entweder man versucht das Umbenennen mit Schleifen oder verwendet spezielle Programme.
rename
prename
- Das Umbenennen einer einzelnen Datei ist keine grosse Herausforderung. Doch wie ist vorzugehen, wenn man Hunderte oder Tausende von Dateien – z. B. Fotos aus einer Digitalkamera oder die eigene Musiksammlung – in einem einzelnen Ordner oder in vielen Unterordnern umbennen muss?
- Im grafischen Dateimanager alles markieren und umbenennen funktioniert nicht und jede Datei einzeln umbenennen, dauert viel zu lange. Unter Linux hilft hier „rename“ in Kombination mit den sogenannten „perl regular expressions“ weiter.
„Reguläre Ausdrücke“ sind eine Art „Zwischenabfrage“, welche den Dateinamen vor dem eigentlichen Umbenennen durch „rename“ analysieren.
- Für die meisten Aktionen reicht der Zusatz 's/suchbegriff/ersetzung/g' mitzugeben, wobei s für „single line“ (Ausdruck muss auf einer Zeile stehen) und g für „global“ (ersetzen, sooft der Ausdruck gefunden wird) steht.
- Soll ohne Unterscheidung von Gross- und Kleinschreibung gesucht werden, dann kann Am Ende noch ein i für insensitive (egal, ob gross oder klein geschrieben) mitgegeben werden.
Teile aus dem Dateinamen entfernen
- Es gibt viele Situationen, in denen man Teile des Dateinamens entfernt haben möchte.
- Bei Musiktiteln will man den Namen des Albums beziehungsweise des Interpreten loswerden, bei Bildern doppelt vorhandene Endungen oder überhaupt zuviele Leerzeichen und Bindestriche.
rename 's/Amelie//g' * rename 's/Amelie \(Soundtrack\) - //g' * rename 's/ -//g' *
- Das erste Beispiel entfernt das Wort „Amelie“, das zweite Beispiel die gesamte Zeichenfolge „Amelie \(Soundtrack\) - “ aus dem Namen aller Dateien im aktuellen Verzeichnis.
- Beachten, dass allfällige Sonderzeichen im Suchbegriff – in diesem Fall die runden Klammern – immer mit einem Backslash gekennzeichnet werden müssen.
- Das letzte Beispiel zeigt, dass man auch mehrere Leerzeichen problemlos aus dem Dateinamen entfernen kann.
Teile innerhalb des Dateinamens ersetzen
- Neben dem Entfernen ungewollter Teile aus dem Dateinamen besteht oftmals auch die Notwendigkeit, einzelne Wörter, Buchstaben oder Zeichen zu ersetzen. wie bereits vorhin erwähnt, muss hier ein besonderes Augenmerk auf das „Escapen“ der Sonderzeichen gelegt werden.
rename 's/ /_/g' * oder rename 's/\s+/_/g' *
rename 's/-/./g' * rename 's/\'/’/g' * rename 's/^/Amélie_Soundtrack_/' *.ogg rename 's/ogg$/ogn/' *.ogg
- Das erste Beispiel ersetzt alle Leerzeichen durch Unterstriche, das zweite alle Bindestriche durch Punkte und das dritte alle falschen Apostrophe durch typographisch richtige im Namen aller Dateien im aktuellen Verzeichnis.
- Die beiden letzten Beispiele benutzen die Sonderzeichen ^ (= Anfang der Zeile) und $ (= Ende der Zeile), um das Ersetzen auf einen bestimmten Bereich des Dateinamens einzugrenzen; daher kann auch das g für global wegfallen.
- Um zu Testen, wie wichtig das „Escapen“ der Sonderzeichen ist, versuchen sie einmal die beiden Befehle „rename 's/ /./g' *“ und „rename 's/./ /g' *“ hintereinander. Auweia!
- Dummerweise steht der Punkt in den Regular Expressions für "irgendein Zeichen", d. h. der letzte Befehl ersetzt jedes Zeichen im Dateinamen durch ein Leerzeichen! Der korrekte zweite Befehl muss daher „rename 's/\./ /g' *“ lauten – und zum Retten der Dateiendung anschliessend noch „rename 's/ ogg$/.ogg/g' *“.
Gross- und Kleinschreibung des Dateinamens manipulieren
- Die Gross- und Kleinschreibung eines Dateinamens lässt sich ebenfalls sehr einfach mit einem „Einzeiler“ ändern, wobei dies den gesamten Dateinamen, aber auch nur Teile davon betreffen kann.
rename 'y/[A-Z]/[a-z]/' *
rename 's/\.JPG/\.jpg/g' *.JPG rename 's/^\w/\U$&/g' *
- Das erste Beispiel ersetzt alle grossgeschriebenen Buchstaben durch kleingeschriebene.
- Da hier nicht nach einem einzelnen zusammenhängenden Begriff gesucht, sondern ein ganzer Buchstabenbereich analysiert wird und einzelne Zeichen mit einem korrespondierenden Zeichen (eben ein A durch ein a und ein Z durch ein z) ersetzt werden, muss anstelle des s ein y (transliteration) gesetzt werden.
- Das zweite Beispiel hingegen ersetzt wiederum nur einen einzigen Begriff, nämlich das gross geschriebene „.JPG“ durch ein klein geschriebenes „.jpg“, daher die bekannte Kombination „'s/ / /g'“.
- Das letzte Beispiel sieht ein wenig komplex aus, ist aber leicht erklärt: es wir nach dem Wort (\w) am Anfang (^) der Zeile (/s) gesucht, dann aber nur der erste Buchstabe ($&) gross geschrieben (\U).
Teile des Dateinamens umbauen und ergänzen
- Insbesondere bei grösseren digitalen Bildersamlungen möchte man gerne die nichtssagenden Zahlen im Namen, welche von der Digitalkamera generiert werden, durch aussagekräftige Dateinamen ersetzten. Auch dies ist mit „rename“ problemlos möglich.
rename 's/(\d{8})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
rename 's/\d{5}(\d{3})\.JPG$/Türkeiferien_$1\.jpg/' *.JPG
- Obiges Beispiel nimmt die ersten acht Zahlen (\d{8}) des Dateinamens aller auf JPG-Dateien (\.JPG) und speichert diese für die spätere Weiterverwendung (daher die runden Klammern um \d{8} herum).
- Der neue Dateiname besteht aus der Bezeichnung „Türkeiferien_“ und der vorhin gespeicherten acht Zahlen, die mittels der Variablen $1 angehängt werden; zudem wird die Dateiendung noch in Kleinbuchstaben (\.jpg)umgewandelt.
- Das zweite Bbeispiel ist sogar noch ein wenig ausgefeilter, denn es speichert nur die letzten drei Zahlen ((\d{3})) des alten achtzahligen Dateinamens, um sie nachher an die Bezeichnung „Türkeiferien_“ anzufügen.
- Neben dem regulären Ausdruck für „irgendeine Zahl, aber kein Buchstabe“ (\d) gibt es natürlich auch noch denjenigen für „irgendeinen Buchstaben, aber keine Zahl“ (\w) oder deren Umkehrung „alles, nur keine Zahl“ (\D) und „alles, nur keinen Buchstaben“ (\W).
- Leerzeichen können entweder als solche gesetzt werden (siehe erste Beispiele weiter oben) oder aber mit dem regulären Ausdruck \s – oder natürlich auch mit dessen Umkehr \S („alles, ausser Leerezeichen“) – aufgespürt werden.
Komplexere Operationen am Dateinamen
- Natürlich sind auch komplexere Operationen mit „rename“ möglich, welche jedoch ein erweitertes Verständnis der „perl regular expressions“ und bisweilen auch einen grossen Zeitaufwand mit sich bringen. Anbei nur ein Beispiel, wie man die Dateigrösse an den Dateinamen anhängen kann:
rename -n 's/$/",size=".(-s)/e' *.jpg
- Oftmals sind allerdings umfangreichere Scripts nötig, da viele Linux-Befehle – darunter leider auch „rename“ – Ordnerstrukturen nicht rekursiv abarbeiten könne.
- Hier helfen meistens Schlaufen mit Hilfe des Befehl „find“ und Umbennenungen mit „mv“ weiter.
Umbenennen ohne rename
- Sollte der Befehl „rename“ auf dem System nicht vorhanden sein, dann muss auf das Umbenennen mittels „mv“ zurückgegriffen werden.
- Da „mv“ keine regulären Ausdrücke versteht, kann hier nur mit den sogenannten „bash string operators“ gearbeitet werden.
- Für das Suchen und Ersetzen gibt es grundsätzlich zwei Wege: eine kürzest mögliche Zeichenfolge rechts (${var%t*string}) oder links (${var#string}) des gefundenen Begriffs her zu ersetzen.
for i in *.jpg; do mv "$i" "${i%t*.jpg}.jpg"; done
for f in Türkeiferien_*; do mv "$f" "${f#Türkeiferien_}"; done
- Das erste Besipiel würde aus jeder gefundenen Datei von rechts her zuerst die Endung .jpg ausfindig machen, dann alle Buchstaben von rechts nach links zurückgehend löschen (${i%t*}) und schliesslich den neuen Dateinamen mit der Endung .jpg wieder zusammensetzen.
- Aus den Dateinamen 001_Türkeifereien, 002_Türkeifereien etc. würden demnach die Dateinamen 001_, 002_ etc.
- Das zweite Beispiel würde alle Dateien suchen, die mit „Türkeiferien_“ beginnen, danach von links nach rechts alle Buchstaben löschen.
- Aus den Dateinamen Türkeifereien_001, Türkeifereien_002 etc. würden demnach die Dateinamen 001, 002 etc.
Umbenennen mit einer Programmschleife
- Mit einer FOR-Schleife könnte man den gleichen Umbenennungsvorgang auch ohne zusätzliche Programme folgendermaßen schaffen:
for i in DSC*; do mv $i 2002_10_14-${i#DSC}; done
- Meine Problemstellung gerade: Diverse Dateien in diversen Unterverzeichnissen haben "komische" Dateinamen und lassen sich unter Windows nicht entpacken...
- Mein quick-Fix: Dateinamen bereinigen (natürlich unter Linux...) und alle nicht Standard Zeichen ersetzen.
- In diesem Fall war es für mich ausreichend Buchstaben, Zahlen und den Punkt zu lassen, der Rest wurde durch Unterstriche ersetzt
- Dafür verwendete ich folgendes Skript:
find -depth -name "* *" | while read file; do
filePath="$(dirname "${file}")" oldFileName="$(basename "${file}")" newFileName=${oldFileName//[^a-zA-Z0-9\.]/_} mv "${filePath}"/"${oldFileName}" "${filePath}"/"${newFileName}" done
- Das ganze hat nur noch ein kleines Problem:
- Es funktioniert nicht für Dateinamen mit Leerzeichen am Ende des Dateinamens - hier muss das Skript verbessert werden, oder manuell nachgearbeitet.
Dateien löschen (rm)
rm löscht Dateien
rm [-dfirvR] [-directory] [-force] [-interactive] [-recursive] [-verbose] Pfad ...
rm löscht Dateien. Normalerweise werden die Verzeichnisse nicht mit gelöscht.
- Wenn eine Datei gelöscht werden soll, für die keine Schreibberechtigung besteht, muss der Befehl für diese Datei extra bestätigt werden.
- In Verzeichnissen, bei denen das Stickybit gesetzt ist, kann eine Datei nur von ihrem Eigentümer gelöscht werden.
- Die Option `-' zeigt an, dass die folgenden Argumente keine Optionen mehr sind. Dadurch ist es möglich, auch Dateinamen, die mit einem `-' anfangen, zu löschen.
Vorsicht mit Jokerzeichen (*)!
- Ein Leerzeichen zu viel und die Katastrophe ist perfekt.
rm a* | Löscht alle Dateien, die mit einem a beginnen |
rm a·* | Löscht zuerst alle Dateien, die mit einem a beginnen und dann alle Dateien |
Optionen
-d | löscht Verzeichnisse mit dem `unlink' Systemaufruf anstelle von rmdir (nur für die Superuserin Ruth); weil die in einem so gelöschten Verzeichnis enthaltenen Dateien nicht mit gelöscht werden, ist eine anschließende Reparatur des Dateisystems angesagt |
-f | keine Nachfragen, keine Fehlermeldungen |
-i | vor dem Löschen jeder Datei wird nochmal nachgefragt |
-r | der Inhalt aller Unterverzeichnisse und die Verzeichnisse werden mitgelöscht |
-v | zeigt die Namen aller Dateien noch ein letztes Mal an, bevor sie gelöscht werden |
Links
Interne Links
[TODO]