Zauważ, że używasz skryptu Perla zwanegorename
dystrybuowanym przez Debian i jego pochodne (Ubuntu, Mint,…). Inne dystrybucje Linuksa zawierają zupełnie inną i znacznie mniej użyteczną komendę o nazwie rename
.
y/A-Z/a-z/
tłumaczy każdy znak w zakresie A
poprzez Z
do odpowiedniego znaku w zakresie a
poprzez z
, czyli ASCII wielkich liter do odpowiedniej litery małe. Aby wykonać odwrotne tłumaczenie, użyj y/a-z/A-Z/
. Innym sposobem, aby napisać to samo polecenie rename '$_ = uc($_)' *
- uc
jest u pper c funkcja ASE, a rename
komenda zmienia nazwy plików na podstawie przekształceń dokonanych w $_
zmiennej.
rename '…' *
zmienia tylko nazwy plików w bieżącym katalogu, ponieważ to właśnie *
pasuje. Pliki kropkowe (pliki, których nazwa zaczyna się na .
) są również pomijane.
Jeśli chcesz zmieniać nazwy plików w bieżącym katalogu i podkatalogach rekurencyjnie, możesz użyć find
polecenia, aby rekurencyjnie przechodzić do bieżącego katalogu. Jest tu trudność: jeśli zadzwonisz rename
, to zmieni nazwę zarówno katalogu, jak i nazwy podstawowej. Jeśli wywołujesz rename
katalog przed rekursowaniem w nim ( find -exec rename … {} \;
), find
staje się zdezorientowany, ponieważ znalazł katalog, ale katalog ten już nie istnieje, dopóki nie spróbuje w niego zejść. Można to obejść mówiąc find
przemierzać katalogu przed działających na nim, ale potem kończy się próbą zmiany nazwy foo/bar
na FOO/BAR
ale katalog FOO
nie istnieje.
Prostym sposobem na uniknięcie tej trudności jest spowodowanie, aby polecenie zmiany nazwy działało tylko na nazwę podstawową na ścieżce. Wyrażenie regularne ([^/]*\Z)
pasuje do końcowej części ścieżki, która nie zawiera /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Powłoka Zsh zapewnia wygodniejsze funkcje zmiany nazwy - nawet bardziej tajemnicze niż Perl, ale bardziej rozbudowane i często łatwiejsze do skomponowania.
Funkcja zmv
zmienia nazwy plików na podstawie wzorców. Uruchom autoload -U zmv
raz, aby go aktywować (wstaw tę linię do swojego .zshrc
).
W pierwszym argumencie do zmv
(wzorzec do zastąpienia) możesz użyć potężnych wzorców symboli wieloznacznych zsh . W drugim argumencie do zmv
(tekst zastępczy) możesz użyć funkcji rozszerzania parametrów , w tym modyfikatorów historii .
zmv -w '**/*' '$1$2:u'
Wyjaśnienie:
-w
- automatyczne przypisywanie zmiennych numerycznych do każdego wzoru wieloznacznego
**/*
- wszystkie pliki w podkatalogach, rekurencyjnie ( **/
dopasowuje 0, 1 lub więcej poziomów podkatalogów)
$1
- pierwsza zmienna numeryczna, tutaj pasująca do części katalogowej każdej ścieżki
$2:u
- druga zmienna liczbowa, tutaj pasująca do podstawowej nazwy części każdej ścieżki, z :u
modyfikatorem do konwersji wartości na wielkie litery
Dodatkową korzyścią jest przestrzeganie ustawień regionalnych otoczenia.
Jeśli nie masz pewności, co do zmv
polecenia, które napisałeś, możesz przekazać -n
opcję wydrukowania tego, co zrobi polecenie, i niczego nie zmieniać. Sprawdź dane wyjściowe, a jeśli zrobi to, co chcesz, ponownie uruchom komendę bez -n
faktycznego działania.
rename 'y/a-z/A-Z/' *
, dostaniesz to, czego chcesz. Ostrożnie tam, gdzie to przetestujesz.