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:
Otwórz Terminal.app, wpisz, cda następnie przeciągnij i upuść do okna folder zawierający pliki, których nazwa ma zostać zmieniona.
Aby potwierdzić, że jesteś we właściwym katalogu, wpisz lsi 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
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).
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
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:
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).
źródło
foo.txt
iFOO.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):
Musisz także obsługiwać spacje w nazwach plików (dowolny system operacyjny):
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):
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ć:
źródło
Wersja z rybą skorupą:
źródło