Terminal pogryzł człowieka: mmv
Rzadko spotyka się polecenia tekstowe, które ucząc bawią i bawiąc uczą. A mało znane polecenie mmv potrafi dostarczyć wiele pouczającej zabawy podczas konstruowania nazw plików, wykorzystując do tego uproszczonych wyrażeń regularnych. Zabawa w sam raz dla lubiących rebusy oraz potrzebujących przenieść lub zmienić nazwy serii plików.
Komenda mmv pozwala w przyswajalnej formule ‘skąd’ ‘dokąd’ przeprowadzać manipulacje na zbiorze plików. Manipulacje oznaczają kopiowanie, przenoszenie, zmienianie nazwy, linkowanie, łączenie, a wszystko to okraszone magią i potęgą wyrażeń regularnych w formie dla początkujących. Jakie to może być przydatne na pewno wiedzą osoby, które próbowały uporządkować wg. jakiegoś schematu setki nazw w katalogu z np. zdjęciami.
O co chodzi z tymi całymi wyrażeniami? Jako parametry ‘skąd’ ‘dokąd’ dla polecenia mmv można podać ciągi znaków opisujące nazwę źródłową i docelową z wykorzystaniem pewnych wzorców. Wzorce źródłowe określamy za pomocą znaków ‘*’ (dowolna ilość dowolnych znaków), ‘[…]’ (znaki od/do, np. a-z), ‘?’ (dowolny pojedynczy znak), ‘;’ (położenie plików w strukturze katalogów). Wzorce docelowe możemy uzupełnić poprzez znacznik ‘#’ z cyfrowym parametrem N, który określa Nty ciąg znaków z ciągu źródłowego. Brzmi skomplikowanie? Ale to znacznie ułatwia sprawę podmiany wielu nazw jednym poleceniem. Praktyczne przykłady?
Banały
Zwykła i prosta zamiana np. rozszerzeń plików.
dhorx@lappy07:~/test$ ls test1.txt test2.txt test3.txt dhorx@lappy07:~/test$ mmv "*.txt" "#1.bak" dhorx@lappy07:~/test$ ls test1.bak test2.bak test3.bak
Ciąg oznaczony przez ‘*’ to znaki od początku nazwy pliku, to momentu napotkania ‘.txt’. Program zapamiętuje ten ciąg pod ‘#1’ i ten fakt skrupulatnie wykorzystujemy.
Kilka banałów więcej
Potrafimy się posługiwać jednym ciągiem znaków, a co z dwoma?
dhorx@lappy07:~/test$ ls test1.txt test2.txt test3.txt dhorx@lappy07:~/test$ mmv "?es*.txt" "#1_es_#2.txt" dhorx@lappy07:~/test$ ls t_es_t1.txt t_es_t2.txt t_es_t3.txt
To też było proste.
Nieoczekiwana zamiana miejsc
Nie ma oczywiście przymusu co do kolejności znaczników ‘#’:
dhorx@lappy07:~/test$ ls test1.txt test2.txt test3.txt dhorx@lappy07:~/test$ mmv "?es*.txt" "#2_es_#1.txt" dhorx@lappy07:~/test$ ls t1_es_t.txt t2_es_t.txt t3_es_t.txt
Jak ten duży zaczął krążyć…
Zmiana z dużych liter na małe i na odwrót? Proszę bardzo:
dhorx@lappy07:~/test$ ls test1.txt test2.txt test3.txt dhorx@lappy07:~/test$ mmv "?es*.txt" "#u2_es_#u1.txt" dhorx@lappy07:~/test$ ls T1_es_T.txt T2_es_T.txt T3_es_T.txt
Trick polega na tym, że po znaku ‘#’ podajemy pożądaną wielkość liter w podstawianym ciągu (u – zamiana na małe znaki, l – na duże), a następnie numer ciągu w kolejności.
Tak wyglądają podstawy. Bowiem mmv posiada kilka dodatkowych parametrów, jak np. -v (więcej informacji o działaniu), -r (obsługa katalogów), -c (kopiowanie zamiast przenoszenia), -a (scalanie treści plików), itp. Zasadniczo godne polecenia jest przestudiowanie ‘man mmv’.
Jeżeli ktoś uzna, że to jest to, czego potrzebował, to program znajduje się w repozytoriach chyba wszystkich dystrybucji – trzeba go zainstalować, gdyż domyślnie nie dostajemy go w pakiecie.
Fajna rzecz, dzięki.
Trochę mylące przykłady – podczas czytania wpisu cały czas się zastanawiałem po co to wszystko, skoro rename (z bardziej regexpową składnią zresztą) wystarczy. Ale rename nie zrobi cp/mv/symlinka…