Ich möchte alle Dateien und Ordner (Unterordner) rekursiv in Großbuchstaben umbenennen.
Ich habe einige Skripte gefunden, die es in Kleinbuchstaben machen, aber ich weiß nicht, wie ich sie ändern soll, damit es umgekehrt funktioniert (von unten nach oben).
Das Skript, das ich gefunden habe und das für Kleinbuchstaben funktioniert, aber ich wusste nicht, wie ich es ändern sollte, ist:
rename 'y/A-Z/a-z/' *
Es ist aus man rename
.
rename 'y/a-z/A-Z/' *
Sie das bekommen, was Sie wollen , wenn Sie es versuchen . Seien Sie vorsichtig, wo Sie es testen.Antworten:
Beachten Sie, dass Sie das von Debian und Derivaten (Ubuntu, Mint,…) verteilte Perl-Skript verwenden
rename
. Andere Linux-Distributionen liefern einen völlig anderen und wesentlich weniger nützlichen Befehl namensrename
.y/A-Z/a-z/
übersetzt jedes Zeichen im BereichA
durchZ
in das entsprechende Zeichen im Bereicha
durchz
, dh ASCII-Großbuchstaben in den entsprechenden Kleinbuchstaben. Verwenden Sie, um die entgegengesetzte Übersetzung durchzuführeny/a-z/A-Z/
. Eine andere Möglichkeit, denselben Befehl zu schreiben, istrename '$_ = uc($_)' *
-uc
die Funktion u pper c ase, und derrename
Befehl benennt Dateien basierend auf der in die$_
Variable vorgenommenen Umwandlung um .rename '…' *
benennt nur Dateien im aktuellen Verzeichnis um, da dies*
übereinstimmt. Punktedateien (Dateien, deren Name mit beginnt.
) werden ebenfalls übersprungen.Wenn Sie Dateien im aktuellen Verzeichnis und in Unterverzeichnissen rekursiv umbenennen möchten, können Sie mit dem
find
Befehl das aktuelle Verzeichnis rekursiv durchlaufen. Hier gibt es eine Schwierigkeit: Wenn Sie aufrufenrename
, werden sowohl das Verzeichnis als auch der Basisname umbenannt. Wenn Sierename
ein Verzeichnis aufrufen, bevor Sie es erneut verwenden (find -exec rename … {} \;
),find
wird dies verwirrt, da ein Verzeichnis gefunden wurde, dieses Verzeichnis jedoch nicht mehr vorhanden ist, wenn versucht wird, in dieses Verzeichnis abzusteigen. Sie können dies umgehenfind
, indem Sie anweisen , ein Verzeichnis zu durchlaufen, bevor Sie darauf reagieren. Am Ende versuchen Sie jedoch, es umzubenennenfoo/bar
,FOO/BAR
aber das VerzeichnisFOO
existiert nicht.Eine einfache Möglichkeit, diese Schwierigkeit zu vermeiden, besteht darin, den Umbenennungsbefehl nur auf den Basisnamen des Pfads anzuwenden. Der reguläre Ausdruck
([^/]*\Z)
entspricht dem letzten Teil des Pfads, der kein a enthält/
.Die Shell zsh bietet bequemere Funktionen zum Umbenennen - noch kryptischer als Perl, aber knapper und oft einfacher zu komponieren.
Die Funktion
zmv
benennt Dateien basierend auf Mustern um. Führen Sie esautoload -U zmv
einmal aus, um es zu aktivieren (setzen Sie diese Zeile in Ihre.zshrc
).Im ersten Argument zu
zmv
(dem zu ersetzenden Muster) können Sie die leistungsstarken Platzhaltermuster von zsh verwenden . Im zweiten Argument zuzmv
(dem Ersatztext) können Sie die Parametererweiterungsfunktionen einschließlich der Verlaufsmodifikatoren verwenden .Erläuterung:
-w
- Automatische Zuweisung numerischer Variablen zu jedem Platzhaltermuster**/*
- Alle Dateien in Unterverzeichnissen rekursiv (**/
entspricht 0, 1 oder mehr Ebenen von Unterverzeichnissen)$1
- die erste numerische Variable, die hier mit dem Verzeichnisteil jedes Pfads übereinstimmt$2:u
- die zweite numerische Variable, die hier mit dem:u
Basisnamen jedes Pfads übereinstimmt, mit dem Modifikator, um den Wert in Großbuchstaben umzuwandelnAls zusätzlichen Bonus werden die Einstellungen für das Gebietsschema der Umgebung berücksichtigt.
Wenn Sie sich bei einem von
zmv
Ihnen geschriebenen Befehl nicht sicher sind , können Sie die-n
Option übergeben, um zu drucken, was der Befehl tun würde, und nichts ändern. Überprüfen Sie die Ausgabe, und führen Sie den Befehl erneut aus, wenn er das tut, was Sie möchten, ohne-n
tatsächlich zu handeln.quelle
Gestohlen (mit einer geringfügigen Änderung) von Gilles Post hier
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
quelle
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
Sie in sie zurückgreifen.find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
sollte die Umbenennung Verzeichnisse Problem umgehen. Richtig?rename
Änderungen, z. B.foo/bar
anFOO/BAR
undFOO
zu diesem Zeitpunkt nicht vorhanden sind.Ich möchte jeden, der noch mit dieser Antwort verbunden ist, auf die ausgezeichnete Antwort verweisen , die Guiles Quernot auf diese Frage gegeben hat, die nicht erforderlich ist
find
.Der resultierende Befehl wäre:
Aber bevor Sie loslegen, lesen Sie bitte die Antwort, die für Vorbehalte bezüglich alter Bash-Versionen verlinkt ist.
Schließlich, falls sich jemand fragt, was der
y///
Befehl bewirktperl regex
. Hier ist ein Link zur entsprechenden Dokumentation .quelle
find -execdir
| umbenennenDies wäre der beste Weg, wenn es nicht den relativen Pfadwahnsinn gäbe, da Perl Regex Fu nicht nur auf den Basisnamen reagiert:
-execdir
Zuerstcd
s in das Verzeichnis, bevor nur der Basisname ausgeführt wird.Leider kann ich diesen
PATH
Hacking-Teil nicht loswerden undfind -execdir
weigere mich, irgendetwas zu tun, wenn Sie einen relativen Pfad inPATH
... haben: /ubuntu/621132/why-using-the-execdir-action- ist-unsicher-für-Verzeichnis-das-im-Pfad-ist / 1109378 # 1109378quelle
Versuchen Sie dies, nachdem Sie in ein Verzeichnis verschoben haben, in dem Sie die Dateien umbenennen möchten:
quelle
ls -l
nur laufen , um andere Spalten als den Namen abzuschneiden?) Und verwenden Sie doppelte Anführungszeichen um Variablensubstitutionen . Ihr Code ist zu komplex und enthält keine Dateinamen, die Leerzeichen und andere Sonderzeichen enthalten. Verwenden Siefind
oder**/
um in Unterverzeichnisse zurückzukehren, die Ausgabe vonls
ist nur für den menschlichen Verzehr.