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. rename
jest niedostępna, a wiele odmian find
kończy się niepowodzeniem, ponieważ wydaje się, że trzyma się starszej nazwy ścieżki, której nazwa została już zmieniona (np. jeśli znajdzie ./FOO
po niej ./FOO/BAR
, zmiana nazwy ./FOO
na ./foo
nadal 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/bar
wcześniej ./foo
), ale tylko dla plików zawierających wielkie litery. -name
Filtr stosuje się tylko do nazwy pliku podstawa, a nie pełną ścieżkę. Więc to będzie lista, ./FOO/BAR
ale 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 -depth
jest 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 find
i formatuje je w mv
poleceniu przy użyciu wyrażenia regularnego. -n
Opcja zatrzymuje sed
drukowanie wejście, a p
komenda 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 find
wyjścia ./FOO/BAR
, to się stanie mv -n -v -T ./FOO/BAR ./FOO/bar
. -n
Opcja mv
pilnuje istniejących plików małe nie są nadpisywane. -v
Opcja sprawia, że mv
wyjście każda zmiana, która czyni (albo nie robić - jeśli ./FOO/bar
już istnieje, to wysyła coś podobnego ./FOO/BAR -> ./FOO/BAR
, zauważając, że żadna zmiana została dokonana). -T
Jest tutaj bardzo ważne - traktuje plik docelowy jako katalogu. Zapewni to, że ./FOO/BAR
nie zostanie on przeniesiony, ./FOO/bar
jeśli katalog istnieje.
Użyj tego razem z, find
aby wygenerować listę poleceń, które zostaną wykonane (przydatne do sprawdzenia, co zostanie zrobione bez robienia tego)
sh
To dość oczywiste. Kieruje wszystkie wygenerowane mv
polecenia do interpretera powłoki. Możesz go zastąpić bash
powłoką lub dowolną powłoką, która Ci się podoba.
ABCdef
,abcDEF
iaBcDeF
? 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