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. :))

Autorem blogu je šestnáctiletý student neratovického gymnázia, které navštěvuje šestým rokem. Zajímají ho počítače a vše s nimi spojené. Proto také píše tento blog, aby se mohl "vykecat", případně přispět nějakou radou ohledně PC.