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:
Öffnen Sie Terminal.app, geben Sie cdden Ordner mit den umzubenennenden Dateien ein und ziehen Sie ihn in das Fenster.
Um zu bestätigen, dass Sie sich im richtigen Verzeichnis befinden, geben Sie ein lsund drücken Sie die Eingabetaste.
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
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.)
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
Antworten:
Wenn Sie mit dem Terminal vertraut sind:
cd
den Ordner mit den umzubenennenden Dateien ein und ziehen Sie ihn in das Fenster.ls
und drücken Sie die Eingabetaste.Fügen Sie diesen Code ein und drücken Sie die Eingabetaste:
ls
und 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.)
quelle
foo.txt
und habenFOO.TXT
, kann dies eine davon beschädigen.mv "$f" "${f,,}"
oderdeclare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
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):
Sie müssen auch Leerzeichen in Dateinamen (jedes Betriebssystem) verarbeiten:
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):
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:
quelle
Eine Fischschalenversion:
quelle