Ich muss einen vollständigen Ordnerbaum rekursiv umbenennen, damit nirgendwo Großbuchstaben angezeigt werden (es ist C ++ - Quellcode, aber das sollte keine Rolle spielen).
Bonuspunkte für das Ignorieren von CVS- und Subversion-Versionskontrolldateien / -ordnern. Der bevorzugte Weg wäre ein Shell-Skript, da eine Shell auf jeder Linux-Box verfügbar sein sollte.
Es gab einige gültige Argumente zu Details der Umbenennung von Dateien.
Ich denke, Dateien mit denselben Kleinbuchstaben sollten überschrieben werden. Es ist das Problem des Benutzers. Beim Auschecken in einem Dateisystem, bei dem die Groß- und Kleinschreibung ignoriert wird, wird auch das erste mit dem letzteren überschrieben.
Ich würde AZ-Zeichen betrachten und sie in az umwandeln, alles andere erfordert nur Probleme (zumindest mit dem Quellcode).
Das Skript wird benötigt, um einen Build auf einem Linux-System auszuführen. Daher sollten Änderungen an CVS- oder Subversion-Versionskontrolldateien weggelassen werden. Immerhin ist es nur eine Rubbelkasse. Vielleicht ist ein "Export" angemessener.
ABCdef
,abcDEF
undaBcDeF
? Sollte das Umbenennungsskript abbrechen oder nur warnen und fortfahren? 2. Wie definieren Sie Kleinbuchstaben für Nicht-US-ASCII-Namen? Wenn solche Namen vorhanden sein könnten, sollte zuerst eine Überprüfung und ein Ausschluss durchgeführt werden? 3. Wenn Sie eine Umbenennungsoperation ausführenAntworten:
Eine kurze Version mit dem
"rename"
Befehl:Dies vermeidet Probleme beim Umbenennen von Verzeichnissen vor Dateien und beim Versuch, Dateien in nicht vorhandene Verzeichnisse (z . B.
"A/A"
in"a/a"
) zu verschieben.Oder eine ausführlichere Version ohne Verwendung
"rename"
.PS
Letzteres ermöglicht mehr Flexibilität mit dem Befehl move (z. B.
"svn mv"
).quelle
then
geschlossene Zeile durch ersetzt(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Fügen Sie -f hinzu, um umzubenennen, wenn Sie sich in einem Dateisystem befinden, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird (z. B. Mac)-T
aus demmv
Befehl entfernte.Kleiner noch mag ich ganz:
Bei Dateisystemen ohne Berücksichtigung der Groß- und Kleinschreibung, z. B. HFS + von OS X , sollten Sie das folgende
-f
Flag hinzufügen :quelle
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(und von einem gleichnamigen Paket bereitgestellt)quelle
find
.find .
scheint dies zu beheben.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Versuchen Sie einfach Folgendes, wenn Sie sich nicht um Effizienz kümmern müssen.
quelle
-0
Schalter (das ist 'Null', keine Komprimierung) beschleunigenzip -0 -r foo.zip foo/
.-0
Komprimierung fast augenblicklich war!Mann, ihr Jungs / Mädels mag es, Dinge zu komplizieren ... Benutzen:
quelle
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, dh versuchen Sie, den gesamten Pfad anstelle nur der Datei umzubenennen.Die meisten der oben genannten Antworten sind gefährlich, da sie sich nicht mit Namen befassen, die ungerade Zeichen enthalten. Ihre sicherste Wette für diese Art von Dingen ist die Verwendung
find
der-print0
Option, mit der Dateinamen mit ASCII NUL anstelle von \ n beendet werden.Hier ist ein Skript, das nur Dateien und keine Verzeichnisnamen ändert, um nicht zu verwirren
find
:Ich habe es getestet und es funktioniert mit Dateinamen, die Leerzeichen, Anführungszeichen aller Art usw. enthalten. Dies ist wichtig, da Sie als Root eines dieser anderen Skripte in einem Baum ausführen, der die von erstellte Datei enthält
... Rate mal ...
quelle
rename
alsmv
.Dies funktioniert, wenn Sie den Umbenennungsbefehl bereits haben oder eingerichtet haben (z. B. durch Brew-Installation auf dem Mac):
quelle
brew install rename
--lower-case
? Das ist zumindest unter Arch Linux leider nicht der Fall.rename
ist keine eingebaute Bash. Es ist ein externes Dienstprogramm und die Syntax hängt von der installierten Version ab. Diese Antwort reicht als tragbare Lösung "für alle Unix-basierten Betriebssysteme" nicht aus.rename
Befehl, der in der neuesten Version von Fedora (28) enthalten ist, über dasutil-linux-2.31
Paket keine--lower-case
Option.Dies funktioniert unter CentOS / Red Hat Linux oder anderen Distributionen ohne das
rename
Perl-Skript:Quelle: Benennen Sie alle Dateinamen von Groß- in Kleinbuchstaben um
(In einigen Distributionen stammt der Standardbefehl
rename
von util-linux, und das ist ein anderes, inkompatibles Tool.)quelle
Der einfachste Ansatz, den ich unter Mac OS X gefunden habe, war die Verwendung des Umbenennungspakets von http://plasmasturm.org/code/rename/ :
quelle
Hier ist meine suboptimale Lösung mit einem Bash-Shell-Skript:
Ordner werden alle korrekt umbenannt, und
mv
keine Fragen, wenn die Berechtigungen nicht übereinstimmen, und CVS-Ordner werden nicht umbenannt (CVS-Steuerdateien in diesem Ordner werden leider immer noch umbenannt).Da "find -depth" und "find | sort -r" beide die Ordnerliste in einer verwendbaren Reihenfolge zum Umbenennen zurückgeben, habe ich es vorgezogen, "-depth" zum Durchsuchen von Ordnern zu verwenden.
quelle
In der ursprünglichen Frage wurde das Ignorieren von SVN- und CVS-Verzeichnissen gestellt. Dies kann durch Hinzufügen von -prune zum Befehl find erfolgen. ZB CVS ignorieren:
[Bearbeiten] Ich habe dies ausprobiert und das Einbetten der Kleinbuchstabenübersetzung in den Fund hat aus Gründen, die ich nicht wirklich verstehe, nicht funktioniert. Ändern Sie dies also in:
Ian
quelle
Verwenden des Dateinamen-Fixers von Larry Wall:
Es ist so einfach wie
(wo
fix
ist natürlich das obige Skript)quelle
Dies ist ein kleines Shell-Skript, das das tut, was Sie angefordert haben:
Beachten Sie die Aktion -tiefe im ersten Fund.
quelle
Nicht tragbar, nur Zsh, aber ziemlich prägnant.
Stellen Sie zunächst sicher, dass
zmv
geladen ist.Stellen Sie außerdem sicher, dass Folgendes aktiviert
extendedglob
ist:Dann benutze:
Rekursiv Kleinbuchstaben von Dateien und Verzeichnissen, bei denen der Name nicht CVS ist .
quelle
find -depth
druckt jede Datei und jedes Verzeichnis, wobei der Inhalt eines Verzeichnisses vor dem Verzeichnis selbst gedruckt wird.${f,,}
Kleinschreibung des Dateinamens.quelle
-depth
behebt das! Dies ist eine wirklich schnelle Lösung, aber natürlich ohne die-print0
Option zu finden, ist es nicht die zuverlässigsteUnter MacOS
Installieren Sie das
rename
Paket,Verwenden,
Dieser Befehl findet alle Dateien mit einer
*.py
Erweiterung und konvertiert die Dateinamen in Kleinbuchstaben.Beispielsweise,
quelle
-I
Option verwendetxargs
?- I
Flagge ist nicht obligatorisch. Es wird verwendet, wenn wir mehrere Befehle mit ausführenxargs
. Hier ist ein Beispiel für die Verwendung mehrerer Befehle mitxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Sie können ohne-I
likefind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Verwendung typeset :
Unter Windows können Emulationen wie Git Bash fehlschlagen, da Windows unter der Haube nicht zwischen Groß- und Kleinschreibung unterscheidet.
mv
Fügen Sie für diese einen Schritt, bei dem es sich um die Datei handelt, zuerst einem anderen Namen hinzu, z. B. "$ old.tmp", und dann einem$new
.quelle
Langwierig, aber "funktioniert ohne Überraschungen und ohne Installationen"
Dieses Skript verarbeitet Dateinamen mit Leerzeichen, Anführungszeichen, anderen ungewöhnlichen Zeichen und Unicode. Es funktioniert in Dateisystemen ohne Berücksichtigung der Groß- und Kleinschreibung und in den meisten Unix-y-Umgebungen , in denen bash und awk installiert sind (dh fast alle). Es werden auch eventuelle Kollisionen gemeldet (wobei der Dateiname in Großbuchstaben belassen wird) und natürlich sowohl Dateien als auch Verzeichnisse umbenannt und rekursiv ausgeführt. Schließlich ist es sehr anpassungsfähig: Sie können den Befehl find optimieren, um auf die gewünschten Dateien / Verzeichnisse abzuzielen, und Sie können awk optimieren, um andere Namensmanipulationen durchzuführen. Beachten Sie, dass mit "behandelt Unicode" meine, dass es tatsächlich ihre Groß- / Kleinschreibung konvertiert (ignorieren Sie sie nicht wie Antworten, die verwendet werden
tr
).Verweise
Mein Skript basiert auf diesen hervorragenden Antworten:
/unix/9496/looping-through-files-with-spaces-in-the-names
Wie konvertiere ich eine Zeichenfolge in Bash in Kleinbuchstaben?
quelle
Dies funktioniert auch unter MacOS:
quelle
Ich musste dies bei einem Cygwin-Setup unter Windows 7 tun und stellte fest, dass ich Syntaxfehler mit den oben genannten Vorschlägen hatte (obwohl ich möglicherweise eine funktionierende Option verpasst habe). Diese Lösung direkt aus den Ubuntu-Foren hat jedoch aus der Dose heraus funktioniert :-)
(NB: Ich hatte zuvor Leerzeichen durch Unterstriche ersetzt, indem ich:
)
quelle
In OS X wird der
mv -f
Fehler "Gleiche Datei" angezeigt, daher benenne ich ihn zweimal um:quelle
In dieser Situation würde ich nach Python greifen, um zu vermeiden, dass Pfade ohne Leerzeichen oder Schrägstriche optimistisch angenommen werden. Ich habe auch festgestellt, dass
python2
in der Regel an mehr Orten als installiert werdenrename
.quelle
Wenn Sie Arch Linux verwenden , können Sie ein
rename
Paket installierenAUR
, das denrenamexm
Befehl als/usr/bin/renamexm
ausführbare Datei und eine Handbuchseite dazu bereitstellt .Es ist ein wirklich mächtiges Werkzeug, um Dateien und Verzeichnisse schnell umzubenennen.
In Kleinbuchstaben konvertieren
In UPPER-Fall konvertieren
Andere Optionen
Sie können die Beispieldatei Developers.mp3 bei Bedarf von hier abrufen;)
quelle
brew
unter macOS hat-l
dazu geführt, dass ein Symlink erstellt und-c
in Kleinbuchstaben konvertiert werden muss.Benennen Sie zuerst die Verzeichnisse von unten nach oben um, sort -r (wobei -depth nicht verfügbar ist) und dann die Dateien. Dann grep -v / CVS statt find ...- beschneiden, weil es einfacher ist. Bei großen Verzeichnissen kann bei f in ... einige Shell-Puffer überlaufen. Verwenden Sie find ... | während gelesen , um das zu vermeiden.
Und ja, dies wird Dateien blockieren, die sich nur für den Fall unterscheiden ...
quelle
find YOURDIR -type d | sort -r
ist zu viel Mühe. Du willstfind YOURDIR -depth -type d
. Zweitens muss dasfind -type f
MUSS ausgeführt werden, nachdem die Verzeichnisse umbenannt wurden.Ich habe die hier erwähnten ausführlicheren Skripte nicht ausprobiert, aber keine der einzelnen Befehlszeilenversionen funktionierte auf meinem Synology NAS für mich.
rename
ist nicht verfügbar, und viele der Varianten vonfind
fail schlagen fehl, da sie anscheinend am älteren Namen des bereits umbenannten Pfads festhalten (z. B. wird, wenn./FOO
gefolgt von./FOO/BAR
, das Umbenennen./FOO
in./foo
wird weiterhin aufgelistet./FOO/BAR
, obwohl dieser Pfad nicht mehr gültig ist). . Der obige Befehl funktionierte für mich ohne Probleme.Was folgt, ist eine Erklärung für jeden Teil des Befehls:
Dadurch wird jede Datei aus dem aktuellen Verzeichnis (ändern finden
.
, was auch immer Verzeichnis , das Sie bearbeiten wollen), eine Tiefensuche (zB., Wird es Liste./foo/bar
vor./foo
), aber nur für Dateien , die einen Großbuchstaben enthalten. Der-name
Filter gilt nur für den Basisdateinamen, nicht für den vollständigen Pfad. Das wird also./FOO/BAR
aber nicht aufgelistet./FOO/bar
. Dies ist in Ordnung, da wir nicht umbenennen möchten./FOO/bar
. Wir möchten zwar umbenennen./FOO
, aber dieses wird später aufgeführt (deshalb-depth
ist es wichtig).Dieser Befehl an sich ist besonders nützlich, um die Dateien zu finden, die Sie zuerst umbenennen möchten. Verwenden Sie diese Option nach dem vollständigen Umbenennungsbefehl, um nach Dateien zu suchen, die aufgrund von Kollisionen oder Fehlern mit Dateinamen noch nicht ersetzt wurden.
Dieser Teil liest die von ausgegebenen Dateien
find
und formatiert sie in einemmv
Befehl mit einem regulären Ausdruck. Die-n
Option stoppt dassed
Drucken der Eingabe, und derp
Befehl im regulären Regex zum Suchen und Ersetzen gibt den ersetzten Text aus.Der reguläre Ausdruck selbst besteht aus zwei Erfassungen: dem Teil bis zum letzten / (dem Verzeichnis der Datei) und dem Dateinamen selbst. Das Verzeichnis bleibt erhalten, aber der Dateiname wird in Kleinbuchstaben umgewandelt. Also, wenn
find
Ausgänge./FOO/BAR
, wird es werdenmv -n -v -T ./FOO/BAR ./FOO/bar
. Die-n
Optionmv
stellt sicher, dass vorhandene Kleinbuchstaben nicht überschrieben werden. Die-v
Option gibtmv
jede Änderung aus, die sie vornimmt (oder nicht vornimmt - falls sie./FOO/bar
bereits vorhanden ist, gibt sie so etwas wie aus./FOO/BAR -> ./FOO/BAR
, wobei darauf hingewiesen wird, dass keine Änderung vorgenommen wurde). Das-T
ist hier sehr wichtig - es behandelt die Zieldatei als Verzeichnis. Dadurch wird sichergestellt, dass das Verzeichnis./FOO/BAR
nicht verschoben wird,./FOO/bar
wenn es zufällig vorhanden ist.Verwenden Sie dies zusammen mit
find
, um eine Liste der Befehle zu erstellen, die ausgeführt werden (praktisch, um zu überprüfen, was getan wird, ohne es tatsächlich zu tun).Das ist ziemlich selbsterklärend. Es leitet alle generierten
mv
Befehle an den Shell-Interpreter weiter. Sie können es durchbash
oder eine beliebige Hülle nach Ihren Wünschen ersetzen .quelle
Slugify Rename (Regex)
Es ist nicht genau das, wonach das OP gefragt hat, aber was ich auf dieser Seite zu finden gehofft hatte:
Eine "Slugify" -Version zum Umbenennen von Dateien, damit diese URLs ähneln (dh nur alphanumerische Zeichen, Punkte und Bindestriche enthalten):
quelle