Blog PC Videa Osobní Fotografie

Dávkové přejmenování v Bashi

Včera, nebo kdy to bylo jsem opět stál před problémem zvaným přejmenování. Potřeboval jsem přejmenovat několik desítek souborů najednou stylem jméno_001, jméno_002... Jenomže jak? Ručně? Nepřichází v úvahu. KRename? Nechat si do systému zbytečně rozbalit cca 80MB? Zbytečnost. A vzhledem k mé lenosti a neschopnosti najít něco jiného mi nezbylo nic jiného, než si takový jednoduchý nástroj napsat sám. Jediný jazyk, který ovládám aspoň trošku a zároveň by mohl vyřešit tento problém je, celkem logicky, Bash. S tímto skriptovacím jazykem Linuxu je podobný úkon naprostá hračka. Stačí jeden soubor, jeden cyklus a práce je hotova. Pojďme se podívat, jak na to.

Co budeme umět?
Náš "prográmek" (resp. skript) bude umět přejmenovávat soubory daného typu, přiřadí jim jméno podle daného vzoru a bude se tvářit jako obyčejný program (to nám zajistí nakopírování do /usr/bin). Jako poslední, možná nejméně potřebnou, funkci bych zmínil "nastínění", jak by přejmenování dopadlo (tzn. soubory se nepřejmenují, ale pouze vypíší).

Kód
#!/bin/bash

# Dávkové přejmenování souborů v aktuální složce

filename=$1;
extension=$2;

if [ $filename"." != "." ]; then
	if [ $extension"." != "." ]; then

		count=0;

		files=`ls |grep $2$`;

		for i in $files; do
			count=`echo $((count+1))`;

			if [ ${#count} == 1 ]; then
				print=`echo "00"$count`;
			elif [ ${#count} == 2 ]; then
				print=`echo "0"$count`;
			else
				print=$count;
			fi;

			echo $i" -> "$1"_"$print"."$2;

			if [ $3"." == "." ]; then
				mv $i $1"_"$print"."$2;
				echo "	Přejmenováno";
			fi;
		done;
	else
		echo "Druhý parametr obsahuje příponu přejmenovávaných souborů.";
	fi;
else
	echo "Zadej jméno souborů, které má být všude stejné.";
fi;

Ano, opravdu těchto pár řádků plní to, co jsem uvedl výše. Nyní se pokusíme skript trošku vysvětlit. První dvě podmínky kontrolují, zda jsou zadány parametry - jméno souboru a přípona (soubory s touto příponou se dávkově přejmenují). Do proměnné "files" uložíme výpis vybraných souborů, které se budou procházet v následujícím cyklu.
V následující podmínce se nachází "mechanismus" pro zjištění počtu nul (některé systémy neřadí správně soubory typu soubor_1, soubor_10 apod). V našem skriptu není možné přejmenovat více, než 999 souborů, přidání dalších 9000 (o nulu navíc) bychom provedli jednoduše - další podmínka a jedna nula u každé z již existujících (nám však tento počet bude stačit).
U echa se ani zastavovat nebudeme, všimněme si však kontroly $3 - třetí nepovinný parametr skriptu udává, jestli chceme, nebo nechceme skutečně přejmenovávat soubory. Pokud je zadán, soubory se nepřejmenují, v opačném případě ano. Následuje ukončení podmínek a vypsání případných chybových hlášek.

Jak to spustím?
Stačí nastavit práva na spouštění skriptu, to provedeme příkazem "chmod +x batch_rename" (batch_rename nahraďte jménem vašeho skriptu). Nyní můžeme přejmenovávat velmi jednoduše - /cesta/ke/skriptu/jmeno_skriptu vzorove_jmeno jpg.
Osobně však doporučuji přesunout skript do /usr/bin, odkud ho můžeme spouštět daleko chytřeji - pouze jeho jménem.


[michal@arch-linux ~]$ cd Obrázky/
[michal@arch-linux ~/Obrázky]$ batch_rename obrazek jpg


Upozornění na závěr
Dávejte si pozor, kde skript spouštíte. Dokáže nadělat docela paseku. Pro jistotu si svá data pečlivě zálohujte. :))
Jméno Zapomenout
ICQ / Jabber
WWW
E-mail Zveřejnit
**B** *I* __U__ ::+Zvětšený text+:: ::-Zmenšený text-:: Nečíslovaný seznam Číslovaný seznam ::url:url->text:: ::youtube:odkaz_na_youtube:: Zvětšit pole Zmešit pole
Vzkaz