Osvojte si techniky pro hromadné přejmenovávání souborů v Linuxu a uvolněte příkaz mv
z tohoto úkolu. Zjistíte, že přejmenování je často flexibilnější, rychlejší a někdy i jednodušší. Následující text vás seznámí s tímto výkonným nástrojem.
Proč je mv
nedostačující?
Samotný příkaz mv
není špatný. Funguje dobře a je dostupný na všech distribucích Linuxu, macOS a dalších Unixových systémech. Je tedy vždy k dispozici. Nicméně někdy potřebujete sofistikovanější nástroj než jen základní lopatu.
Hlavním účelem příkazu mv
je přesun souborů. Schopnost přejmenovat soubor při přesunu je pouze vedlejší funkcí. Ačkoliv tím dosáhneme požadovaného, mv
není primárně určen pro hromadné přejmenovávání.
Přejmenování jednoho souboru pomocí mv
Pro přejmenování jednoho souboru pomocí mv
zadejte příkaz mv
, následovaný mezerou, stávajícím názvem souboru, mezerou a novým názvem. Potvrďte stisknutím klávesy Enter.
Po přejmenování můžete provedení akce ověřit příkazem ls
.
mv stary_soubor.txt novy_soubor.txt
ls *.txt
Hromadné přejmenování souborů pomocí mv
Situace se zkomplikuje, pokud potřebujete přejmenovat více souborů najednou. Příkaz mv
nemá vestavěnou funkci pro hromadné přejmenování. Musíte použít složité triky v Bashi. To vyžaduje pokročilejší znalosti příkazového řádku a je v přímém kontrastu s jednoduchostí použití mv
pro jeden soubor.
Komplexita rychle narůstá.
Představme si adresář s různými typy souborů. Některé z nich mají příponu „.prog“ a my je chceme hromadně přejmenovat na „.prg“.
Jak toho dosáhneme? Prohlédněme si soubory nejprve:
ls *.prog -l
Zde je jeden způsob, jak toho dosáhnout bez nutnosti psát složitý Bash skript:
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
Podařilo se? Zkontrolujeme to:
ls *.pr*
Ano, funguje to. Nyní jsou všechny soubory s příponou „.prg“ a žádné soubory „.prog“ v adresáři nejsou.
Co se právě stalo?
Pojďme si tento složitý příkaz rozebrat:
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
První část vytvoří cyklus, který postupně zpracuje všechny soubory „.prog“ v adresáři.
Druhá část definuje, co se má se soubory dělat. Používá mv
k přesunutí každého souboru na nový soubor. Nový soubor bude mít původní název, ale s příponou „.prog“ nahrazenou za „.prg“.
Musí existovat jednodušší způsob
Samozřejmě, že existuje. Je to příkaz rename
.
Příkaz rename
není součástí standardní instalace Linuxu, takže ho možná budete muset doinstalovat. Navíc, v různých distribucích Linuxu se může jmenovat odlišně, ale všechny fungují podobným způsobem. Záleží na vaší distribuci, kterou si musíte doinstalovat.
Na Ubuntu a Debain-založených distribucích nainstalujete rename
takto:
sudo apt-get install rename
Na Fedoře a RedHat-založených distribucích nainstalujete prename
. Všimněte si počátečního „p“, což znamená Perl.
sudo dnf install prename
V Manjaro Linux nainstalujete příkaz pomocí následujícího příkazu. Zde se příkaz jmenuje perl-rename
.
sudo pacman -Syu perl-rename
Zkusme to znovu s rename
Použijeme rename
. Vrátíme soubory zpět do stavu, kdy mají příponu „.prog“.
ls *.prog
Nyní je přejmenujeme následujícím příkazem. Poté ověříme výsledek pomocí ls
. Pokud nepoužíváte Ubuntu nebo Debian, nezapomeňte nahradit rename
příkazem pro vaši distribuci.
rename 's/.prog/.prg/' *.prog
ls *.pr*
Funguje to, nyní jsou všechny soubory s příponou „.prg“ a v adresáři nejsou žádné soubory s příponou „.prog“.
Co se stalo tentokrát?
Pojďme si rozebrat tento příkaz po částech.
První část je název příkazu: rename
(nebo prename
či perl-rename
v jiných distribucích).
Poslední částí je *.prog
, která říká, že rename
má pracovat se všemi soubory „.prog“.
Střední část definuje operaci, kterou chceme provést. s
znamená „substitute“ (nahradit). První výraz (.prog
) je to, co rename
hledá v každém názvu souboru, a druhý výraz (.prg
) je to, čím se má nahradit.
Střední část, tzv. „centrální výraz“, je regulární výraz Perlu. To dává příkazu rename
jeho flexibilitu.
Změna jiných částí názvu souboru
Zatím jsme měnili jen přípony souborů, pojďme upravit i jiné části názvů souborů.
Předpokládejme, že máme adresář plný zdrojových kódů v jazyce C. Všechny názvy souborů mají předponu „slang_“. Můžeme to zkontrolovat pomocí ls
.
ls sl*.c
Nahradíme všechny výskyty „slang_“ za „sl_“. Formát příkazu je nám už známý. Jen měníme hledaný a nahrazující výraz a typ souboru.
rename 's/slang_/sl_/' *.c
Tentokrát hledáme soubory „.c“ a v nich hledáme řetězec „slang_“. Pokud se řetězec „slang_“ v názvu souboru objeví, nahradí se za „sl_“.
Výsledek ověříme stejným příkazem ls
jako před chvílí:
ls sl*.c
Odstranění části názvu souboru
Můžeme odstranit část názvu souboru tím, že ji nahradíme prázdným řetězcem.
ls *.c
rename 's/sl_//' *.c
ls *.c
Vidíme, že všechny soubory s příponou „.c“ mají nyní předponu „sl_“. Pojďme se jí zbavit.
Příkaz rename
má stejný formát jako předtím. Hledáme soubory „.c“. Hledaný výraz je „sl_“, ale nemáme výraz pro náhradu. Dvě lomítka bez ničeho mezi nimi, značí prázdný řetězec.
rename
postupně zpracuje všechny soubory „.c“. Najde řetězec „sl_“ v názvu souboru. A pokud ho najde, nahradí ho prázdným řetězcem – tedy vymaže.
Druhé použití příkazu ls
potvrzuje, že předpona „sl_“ byla z názvů všech souborů „.c“ odstraněna.
Omezení změn na konkrétní části názvu
Pomocí ls
vyhledáme soubory, které mají ve svém názvu řetězec „param“. Poté použijeme rename
, abychom tento řetězec nahradili za „parameter“. Opět použijeme ls
, abychom viděli, jak se to na souborech projevilo.
ls *param*
rename 's/param/parameter/' *.c
ls *param*
Byly nalezeny 4 soubory s řetězcem „param“ v názvu. param.c
, param_one.c
a param_two.c
mají „param“ na začátku, zatímco third_param.c
má „param“ na konci názvu, těsně před příponou.
Příkaz rename
hledal „param“ v názvu souboru a ve všech případech ho nahradil za „parameter“.
Druhé použití příkazu ls
ukazuje, že se přesně toto stalo. Bez ohledu na to, zda byl „param“ na začátku, nebo na konci názvu, byl nahrazen za „parameter“.
Chování centrálního výrazu můžeme upřesnit pomocí metaznaků Perlu. Metaznaky jsou symboly, které reprezentují pozice nebo sekvence znaků. Například, ^
znamená „začátek řetězce“, $
znamená „konec řetězce“ a .
znamená „jakýkoliv znak“ (kromě konce řádku).
Použijeme metaznak „začátek řetězce“ (^
), abychom omezili hledání na začátek názvu souboru.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
Vidíme, že máme vypsané soubory z minulého kroku. Všimněte si, že „parameter“ je na začátku tří názvů a na konci jednoho.
Příkaz rename
má metaznak „začátek řádku“ (^
) před výrazem „parameter“. To říká příkazu rename
, aby hledal „parameter“ pouze na začátku názvu souboru. Pokud je „parameter“ jinde v názvu, příkaz ho ignoruje.
Při kontrole pomocí ls
vidíme, že názvy souborů, které měly „parameter“ na konci názvu, se nezměnily. Zatímco u zbylých tří souborů, kde byl „parameter“ na začátku názvu, se „parameter“ nahradil za „value“.
Síla rename
je v síle Perlu. Celá síla Perlu je vám k dispozici.
Vyhledávání pomocí seskupení
rename
umí ještě více. Podívejme se na situaci, kdy máte podobné řetězce v názvech souborů, ale ne stejné. V takovém případě jednoduché hledání a nahrazování nefunguje.
Pomocí ls
si prohlédneme soubory, které začínají na „str“. Jsou to string.c
a strangle.c
. Oba tyto soubory můžeme přejmenovat najednou pomocí techniky nazvané „seskupování“.
Centrální výraz v tomto příkazu rename
bude hledat řetězce v názvech souborů, které obsahují sekvenci znaků „stri“ nebo „stra“, kde bezprostředně po těchto sekvencích následuje „ng“. Jinými slovy, bude hledat „string“ a „strang“. Nahradíme je za „bang“.
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
Pomocí ls
ověříme, že string.c
se přejmenoval na bang.c
a strangle.c
na banngle.c
.
Použití překladů s rename
Příkaz rename
může také provádět překlady. Jednoduchým příkladem je vynucení velkých písmen v sadě názvů souborů.
V příkazu pro rename
si všimněte, že namísto s/
používáme y/
. To říká příkazu rename
, že neprovádíme náhradu, ale překlad.
Výraz az
je výraz v Perlu, který znamená všechna malá písmena v sekvenci od „a“ do „z“. Podobně, AZ
reprezentuje všechna velká písmena od „A“ do „Z“.
Ústřední výraz v tomto příkazu lze parafrázovat jako: „Pokud se v názvu souboru objeví libovolné malé písmeno od a do z, nahraď je odpovídajícími znaky ze sekvence velkých písmen od A do Z.“
Pokud chceme všechny názvy souborů s příponou „.prg“ převést na velká písmena, použijeme následující příkaz:
rename 'y/az/AZ/' *.prg
ls *.PRG
Příkaz ls
nám ukazuje, že všechny názvy souborů s příponou „.prg“ jsou nyní zapsané velkými písmeny. Vlastně, abychom byli přesní, už to nejsou soubory „.prg“. Jsou to soubory „.PRG“. Linux totiž rozlišuje velká a malá písmena.
Tento poslední příkaz můžeme vrátit zpět prohozením pozic az
a AZ
v centrálním výrazu.
rename 'y/AZ/az/' *.PRG
ls *.prg
Perl se (ne)naučíte za pět minut
Naučit se Perl se vám vyplatí. Nicméně, abyste mohli efektivně využívat příkaz rename
, který vám ušetří čas, nemusíte mít žádné znalosti Perlu. I tak získáte velkou výhodu v rychlosti, jednoduchosti a úspoře času.