Jak zmienić nazwy wszystkich plików na małe litery?

123

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?

Voloda2
źródło
1
Czy czujesz się komfortowo z rozwiązaniem Terminal / Shell? A może chcesz, aby kod C / Objective-C to osiągnął?
Rozwiązanie terminalowe będzie w porządku.
Voloda2
3
Myślę, że to powinno zostać ponownie otwarte. kod terminala jest również kodem
Danield
1
To powinno być ważne pytanie dotyczące przepełnienia stosu. To także jest kod.
adev

Odpowiedzi:

371

Jeśli nie przeszkadza Ci terminal:

  1. Otwórz Terminal.app, wpisz, cda następnie przeciągnij i upuść do okna folder zawierający pliki, których nazwa ma zostać zmieniona.
  2. Aby potwierdzić, że jesteś we właściwym katalogu, wpisz lsi naciśnij Enter.
  3. Wklej ten kod i naciśnij Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Aby potwierdzić, że wszystkie twoje pliki są małe, wpisz lsi 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).

wjl
źródło
9
Bądź ostrożny. Jeśli masz pliki o nazwach foo.txti FOO.TXT, może to spowodować uszkodzenie jednego z nich.
Keith Thompson
1
Dzięki bash możesz po prostu zrobić: mv "$f" "${f,,}"lubdeclare -l g=$f; mv "$f" "$g"
glenn jackman
2
Wypróbowałem wszystkie te polecenia, otrzymałem „mv: 'PPP.txt' i 'ppp.txt' to ten sam plik” i nie ma małych liter w moim pliku ... jakieś pomysły? Czy to dlatego, że jest w tym samym katalogu?
lorless
1
user2066039: To musi być nowa rzecz na Macu, ponieważ większość odpowiedzi starszych niż rok tego nie uwzględnia. Wykonałem to zadanie, używając pośredniego rozszerzenia, takiego jak „jpg1”. Tak więc JPG -> jpg1 -> jpg. Mam nadzieję, że to pomoże.
Joyce
14
Użytkownicy OS X powinni najpierw zmienić nazwę każdego pliku na tymczasową ze względu na system plików bez rozróżniania wielkości liter, np .: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley
10

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
Alex Harvey
źródło
Tak - ale twój przykład sugeruje, że możesz używać małych liter w nazwach plików, używając „mv X x”. Więc tylko to skomentowałem.
cpaludan
mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 Jun 24 15:19 X # mv X x mv: 'X' i 'x' są takie same file # ls -la -rw-r - r-- 1 root root 0 24 czerwca 15:19 X
cpaludan
Przepraszamy za kiepskie formatowanie. WIĘC nie był dla mnie tam dobry.
cpaludan
1
A mój błąd - był w ssh na mojej malinie na współdzielonym dysku (sformatowany hfsplus) - tam nie działa. Ale lokalnie na moim Macu tak.
cpaludan
dla i in *; do j = $ (tr '[: upper:]' '[: lower:]' <<< "$ i"); mv "$ i" "$ j"; pracował dla mnie w Catalina. Dzięki.
Sinan Eldem
2

Wersja z rybą skorupą:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
arseniusz
źródło