Mam na przykład TREE.wav, ONE.WAV. Chcę zmienić jego nazwę na tree.wav, one.wav. Jak zmienić nazwy wszystkich plików na małe litery?
Mam na przykład TREE.wav, ONE.WAV. Chcę zmienić jego nazwę na tree.wav, one.wav. Jak zmienić nazwy wszystkich plików na małe litery?
Odpowiedzi:
Jeśli nie przeszkadza Ci terminal:
cd
a następnie przeciągnij i upuść do okna folder zawierający pliki, których nazwa ma zostać zmieniona.ls
i naciśnij Enter.Wklej ten kod i naciśnij Enter:
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
ls
i ponownie naciśnij Enter.(Podziękowania dla @bavarious na Twitterze za kilka poprawek i podziękowania dla Johna Whitleya poniżej za uczynienie tego bezpieczniejszym w systemach plików bez rozróżniania wielkości liter).
foo.txt
i FOO.TXT
, może to spowodować uszkodzenie jednego z nich.
mv "$f" "${f,,}"
lubdeclare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
Zadane pytanie jest ogólne, a także ważne, dlatego chciałbym udzielić bardziej ogólnej odpowiedzi:
Najprostszy przypadek (bezpieczny przez większość czasu i na Mac OS X, ale czytaj dalej):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Musisz także obsługiwać spacje w nazwach plików (dowolny system operacyjny):
IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Musisz bezpiecznie obsługiwać nazwy plików, które różnią się tylko wielkością liter w systemie plików z rozróżnianiem wielkości liter i nie nadpisywać celu (np. Linux):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done
Uwaga dotycząca systemu Mac OS X:
System plików Maca nie rozróżnia wielkości liter i zachowuje wielkość liter.
Nie ma jednak potrzeby tworzenia plików tymczasowych, jak sugeruje zaakceptowana odpowiedź i komentarze, ponieważ w pierwszej kolejności nie mogą istnieć dwie nazwy plików różniące się tylko wielkością liter, ref .
Aby to pokazać:
$ 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