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.
 

2 komentarze

  1. 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…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Post comment

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.