find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Nie próbowałem bardziej rozbudowanych skryptów wymienionych tutaj, ale żadna z pojedynczych wersji wiersza poleceń nie działała dla mnie na moim serwerze Synology NAS. renamejest niedostępna, a wiele odmian findkończy się niepowodzeniem, ponieważ wydaje się, że trzyma się starszej nazwy ścieżki, której nazwa została już zmieniona (np. jeśli znajdzie ./FOOpo niej ./FOO/BAR, zmiana nazwy ./FOOna ./foonadal będzie wyświetlana./FOO/BAR mimo że ta ścieżka nie jest już prawidłowa) . Powyższe polecenie zadziałało dla mnie bez żadnych problemów.
Poniżej znajduje się wyjaśnienie każdej części polecenia:
find . -depth -name '*[A-Z]*'
Spowoduje to znalezienie dowolnego pliku z bieżącego katalogu (przejdź .do dowolnego katalogu, który chcesz przetworzyć), używając wyszukiwania w pierwszej kolejności (np. Wyświetli listę ./foo/barwcześniej ./foo), ale tylko dla plików zawierających wielkie litery. -nameFiltr stosuje się tylko do nazwy pliku podstawa, a nie pełną ścieżkę. Więc to będzie lista, ./FOO/BARale nie ./FOO/bar. To jest w porządku, ponieważ nie chcemy zmieniać nazwy ./FOO/bar. Chcemy jednak zmienić nazwę ./FOO, ale ta jest wymieniona później (dlatego -depthjest ważna).
To polecenie samo w sobie jest szczególnie przydatne do znajdowania plików, których nazwy chcesz zmienić. Użyj tego po wykonaniu pełnego polecenia zmiany nazwy, aby wyszukać pliki, które nadal nie zostały zastąpione z powodu kolizji nazw plików lub błędów.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Ta część odczytuje pliki wyprowadzone przez findi formatuje je w mvpoleceniu przy użyciu wyrażenia regularnego. -nOpcja zatrzymuje seddrukowanie wejście, a pkomenda w poszukiwaniu i zamiany regex wyjść wymieniony tekstowych.
Samo wyrażenie regularne składa się z dwóch przechwyceń: części aż do ostatniego / (czyli katalogu pliku) i samej nazwy pliku. Katalog pozostaje nienaruszony, ale nazwa pliku jest przekształcana na małe litery. Więc jeśli findwyjścia ./FOO/BAR, to się stanie mv -n -v -T ./FOO/BAR ./FOO/bar. -nOpcja mvpilnuje istniejących plików małe nie są nadpisywane. -vOpcja sprawia, że mvwyjście każda zmiana, która czyni (albo nie robić - jeśli ./FOO/barjuż istnieje, to wysyła coś podobnego ./FOO/BAR -> ./FOO/BAR, zauważając, że żadna zmiana została dokonana). -TJest tutaj bardzo ważne - traktuje plik docelowy jako katalogu. Zapewni to, że ./FOO/BARnie zostanie on przeniesiony, ./FOO/barjeśli katalog istnieje.
Użyj tego razem z, findaby wygenerować listę poleceń, które zostaną wykonane (przydatne do sprawdzenia, co zostanie zrobione bez robienia tego)
sh
To dość oczywiste. Kieruje wszystkie wygenerowane mvpolecenia do interpretera powłoki. Możesz go zastąpić bashpowłoką lub dowolną powłoką, która Ci się podoba.
ABCdef,abcDEFiaBcDeF? Czy skrypt zmiany nazwy powinien przerwać, czy po prostu ostrzec i kontynuować? 2. Jak definiuje się małe litery w nazwach innych niż US-ASCII? Jeśli takie nazwiska mogą być obecne, czy należy najpierw sprawdzić i wykluczyć zaliczenie? 3. Jeśli prowadzisz operację zmiany nazwy