Jak používat příkaz pro přejmenování v systému Linux

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.