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?


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).


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.