Wie benenne ich alle Dateien in Kleinbuchstaben um?


120

Ich habe zum Beispiel TREE.wav, ONE.WAV. Ich möchte es in tree.wav, one.wav umbenennen. Wie benenne ich alle Dateien in Kleinbuchstaben um?


1
Sind Sie mit einer Terminal / Shell-Lösung vertraut? Oder möchten Sie, dass C / Objective-C-Code dies erreicht?

Terminallösung wird in Ordnung sein.
Voloda2

3
Ich denke, das sollte wieder geöffnet werden. Terminal Code ist auch Code
Danield

1
Dies sollte eine gültige Frage zum Stapelüberlauf sein. Dies ist auch Code.
Adev

Antworten:


365

Wenn Sie mit dem Terminal vertraut sind:

  1. Öffnen Sie Terminal.app, geben Sie cdden Ordner mit den umzubenennenden Dateien ein und ziehen Sie ihn in das Fenster.
  2. Um zu bestätigen, dass Sie sich im richtigen Verzeichnis befinden, geben Sie ein lsund drücken Sie die Eingabetaste.
  3. Fügen Sie diesen Code ein und drücken Sie die Eingabetaste:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Um zu bestätigen, dass alle Ihre Dateien in Kleinbuchstaben geschrieben sind, geben Sie ein lsund drücken Sie erneut die Eingabetaste.

(Vielen Dank an @bavarious auf Twitter für einige Korrekturen und an John Whitley unten, der dies für Dateisysteme ohne Berücksichtigung der Groß- und Kleinschreibung sicherer gemacht hat.)


9
Achtung. Wenn Sie Dateien mit dem Namen foo.txtund haben FOO.TXT, kann dies eine davon beschädigen.
Keith Thompson

1
Mit Bash können Sie einfach tun: mv "$f" "${f,,}"oderdeclare -l g=$f; mv "$f" "$g"
Glenn Jackman

2
Ich habe alle diese Befehle ausprobiert. Ich erhalte die Meldung "mv: 'PPP.txt' und 'ppp.txt' sind dieselbe Datei" und meine Datei wird nicht in Kleinbuchstaben geschrieben. Irgendwelche Ideen? Liegt es daran, dass es sich im selben Verzeichnis befindet?
Lorless

1
user2066039: Dies muss auf dem Mac neu sein, da die meisten Antworten, die älter als ein Jahr sind, dies nicht berücksichtigen. Ich habe die Aufgabe mit einer Zwischenerweiterung wie 'jpg1' erledigt. Also JPG -> jpg1 -> jpg. Hoffentlich hilft das.
Joyce

14
OS X-Benutzer sollten jede Datei aufgrund des Dateisystems, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird, zuerst in einen temporären Namen umbenennen, z. B.: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley

10

Die gestellte Frage ist allgemein und auch wichtig, daher möchte ich eine allgemeinere Antwort geben:

Einfachster Fall (meistens sicher und unter Mac OS X, aber lesen Sie weiter):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Sie müssen auch Leerzeichen in Dateinamen (jedes Betriebssystem) verarbeiten:

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Sie müssen Dateinamen, die sich in einem Dateisystem mit Groß- und Kleinschreibung nur von Groß- und Kleinschreibung unterscheiden, sicher behandeln und das Ziel nicht überschreiben (z. B. Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Hinweis zu Mac OS X:

Das Mac-Dateisystem unterscheidet nicht zwischen Groß- und Kleinschreibung und bewahrt die Groß- und Kleinschreibung.

Es ist jedoch keine Notwendigkeit , temporäre Dateien zu erstellen, wie sie in der akzeptierte Antwort und Kommentare vorgeschlagen, weil zwei Dateinamen , die nur von Fall unterscheiden sich nicht in erster Linie existieren, ref .

Um dies zu zeigen:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Ja - aber Ihr Beispiel legt nahe, dass Sie Dateinamen mit 'mv X x' in Kleinbuchstaben schreiben können. Also habe ich nur kommentiert.
cpaludan

mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 24. Juni 15:19 X # mv X x mv: 'X' und 'x' sind gleich Datei # ls -la -rw-r - r-- 1 root root 0 24. Juni 15:19 X
cpaludan

Entschuldigung für die beschissene Formatierung. SO war dort nicht nett zu mir.
cpaludan

1
Und mein schlechtes - war in einem SSH auf meiner Himbeere auf einem gemeinsam genutzten Laufwerk (hfsplus formatiert) - dort funktioniert es nicht. Aber lokal auf meinem Mac tut es.
cpaludan

für i in *; do j = $ (tr '[: Upper:]' '[: Lower:]' <<< "$ i"); mv "$ i" "$ j"; arbeitete für mich bei Catalina. Vielen Dank.
Sinan Eldem

2

Eine Fischschalenversion:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.