Gdy chcę zmienić nazwę jednego pliku, klikam, wciskam F2, poprawiam i naciskam Enter. Albo wciskam Shift-R w dired. Albo robię coś podobnego. Gorzej, gdy do poprawienia jest kilkanaście czy kilkadziesiąt nazw.
Mam jeszcze w palcach manewry w stylu:
for f in *.txt; do mv "$f" `echo $f | sed s/old/new/`; done
ale można prościej.
Tło
O sprawie przypomniało mi Nexto, które w zakupionym audiobooku uszczęśliwiło mnie następującym kodowaniem znaków:
Książka kupiona w celu pacyfikowania dzieciarni w trakcie podróży, a moje radio samochodowe kiepsko takie rzeczy znosi, więc trzeba było poprawić.
rename
Najwygodniejszym z programików do poprawiania nazw wydaje mi się
rename, pod Ubuntu (i Debianem) dostępny w pakiecie renameutils
:
$ sudo apt-get install renameutils
a gdzie indziej instalowalny z CPAN:
$ cpan rename
Program bierze jako pierwszy parametr perlowe wyrażenie regularne jak zmienić nazwę pliku, a jako pozostały/pozostałe listę plików, których nazwy należy poprawić. Na przykład:
$ rename 's/old/new/' *.png
zmieni old
na new
we wszystkich plikach .png
. Albo
$ rename 's/\.txt$/.bak/' *.txt
zmieni rozszerzenie .txt
na .bak
.
W moim wypadku użyłem go w dwóch krokach:
$ rename 's/ cz\S+ / czesc /' *.mp3
a potem
$ rename 's/rozdzia\S* /rozdzial /' *.mp3
(\S
pasuje do dowolnego nie-białego znaku i pozwoliło mi nie zgadywać czym dokładnie są śmieci
w nazwach plików).
Po poprawieniu części i rozdziałów zostało już tylko kilka błędów, te szybciej było poprawić ręcznie.
mmv
Innym poręcznym, zwłaszcza dla osób mniej przyzwyczajonych do regexpów, programem do zmieniania nazw (a także przenoszenia plików) jest mmv.
Instalacja to po prostu:
$ sudo apt-get install mmv
W przypadku mmv
w masce plików używamy gwiazdek, a w wyniku #1
, #2
itd oznaczają
fragmenty dopasowane do poszczególnych gwiazdek. Na przykład zmianę old
na new
przeprowadzi:
$ mmv -r '*old*' '#1new#2'
Zwracam uwagę na apostrofy, bez nich shell zinterpretuje gwiazdki i hasze. Flaga -r
nakazuje
zmienianie nazwy (bez niej odbywa się move
pliku). Tu nie ma to szczególnego znaczenia,
wyraźniejsze jest gdy pliki są w katalogu innym niż bieżący. Na przykład:
$ mmv -r 'subdir/*old*' '#1new#2'
zmieni subdir/cos-old.txt
na subdir/cos-new.txt
(przy opcji -r
wynik zawsze jest w tym
samym katalogu co źródło). To samo można uzyskać robiąc:
$ mmv 'subdir/*old*' 'subdir/#1new#2'
Bez -r
oczywiście wyniki mogą trafiać i do innego katalogu:
$ mmv 'templates/static-*.xhtml' 'html/#1.html'
Narzędzia wizualne
Dla porządku wspomnę, że podobne zabawy wspiera kilka programów graficznych, np. krename, pyrenamer (chyba najsensowniejszy), gprename. Oczywiście są spakietowane, zatem:
$ sudo apt-get install krename pyrenamer gprename
Szerszego opisu ani screenshotów nie będzie, bo zarówno rename
jak
mmv
pozwalają mi zrobić potrzebną poprawkę zanim graficzny program
zdąży się uruchomić (nie mówiąc o wybieraniu katalogu, plików,
konstrukcji wyrażenia myszą). Ale ... każdy z nich jest lepszy od
ręcznego przeklikiwania stu plików.