Všechny ukázky, které budou následovat, vyžadují ke svému běhu interpret jazyka Perl.
Hromadné přejmenovávání souborů
Úkolem následujícího krátkého prográmku je přejmenovat každý soubor, jehož jméno zadáte jako parametr na příkazové řádce, tak, že na konec jeho jména přidá písmeno „ l
“. Skript slouží hlavně k přejmenovávání souborů *.htm
na *.html
.
Soubor htm2html:
#!/usr/bin/perl use locale; foreach $file (@ARGV) { # pro každý soubor dělej: $new = $file . 'l'; # vytvoř nové jméno souboru if (!-e $new) { # jestliže soubor s takovým jménem neexistuje rename $file, $new; # přejmenuj jej } } |
Zavoláním:
htm2html *.htm
…provede přesně to, co se od něj čeká.
Prográmek můžete upravit tak, aby se přejmenovávání provádělo v podstatě jakkoliv. Stačí jen pozměnit 5. řádek, na kterém se nové jméno souboru ukládá do proměnné $new
.
Na tomto místě uvedu ještě jednu zajímavou modifikaci předchozího souboru:
Soubor 2lower:
#!/usr/bin/perl use locale; foreach $file (@ARGV) { # pro každý soubor dělej: $new = lc($file); # vytvoř nové jméno souboru if (!-e $new) { # jestliže soubor s takovým jménem neexistuje rename $file, $new; # přejmenuj jej } } |
Skript 2lower
změní jména souborů tak, aby všechny byly tvořeny jen z malých písmen abecedy. Máme-li např. v aktuálním adresáři soubory Pokus.HTM, TEST.TXT, obr.gif
, příkazem:
2lower *
…se přejmenují na pokus.htm, test.txt, obr.gif
.
Kopírování disket
Nic proti unixovské filozofii, ale mountování disků může být někdy pěkná otrava. Zvláště když potřebujete do počítače zkopírovat spoustu disket. Proč si práci nezjednodušit, že. Následující prográmek si disketu sám připojí, přesune z ní všechny soubory do aktuálního adresáře a zase odpojí. Program se opakuje tak dlouho, dokud odpovídáte ano (stiskem ENTER) na otázku „Další disketa?“.
Soubor mvfl:
#!/usr/bin/perl use locale; $floppy="/mnt/floppy"; # adresář disketové jednotky while (1) { # nekonečný cyklus system "mount $floppy"; # připojení diskety foreach $x (<$floppy/.*>, <$floppy/*>) { # pro každý soubor, next if ($x eq "$floppy/."); # který se nejmenuje "." next if ($x eq "$floppy/.."); # ani ".." system "mv -iv \"$x\" ."; # zavolej systémový příkaz mv # (přesun souborů i adresářů) } system "umount $floppy"; # odpojení diskety print "Další disketa? (ENTER=Ano, CTRL+C=Ne)\n"; <STDIN>; # čekání na odpověď } |
Tip: Chcete-li soubory jen zkopírovat a z disket nemazat, nahraďte příkaz mv
na 12. řádku voláním systémového programu cp
.
Stahování z Internetu
K dávkovému stahování z Internetu se velice hodí konzolový WWW prohlížeč Lynx. Spustíte-li jej s parametrem -source
, místo interaktivní práce vypíše pouze soubor ze zadané URL adresy a skončí.
Příklad použití Lynxe pro neinteraktivní stahování z Internetu: lynx -source 'http://www.linux.cz' > linux.html |
Předcházející malá ukázka stáhne ze serveru www.linux.cz hlavní stránku a uloží ji do souboru linux.html
.
Lynx nemusíte používat jen ke stažení HTML souborů. Stejně dobře lze uvedeným způsobem získat jakýkoliv binární soubor nebo třeba obrázek.
Tip pro nadšené uživatele Perlu: Chcete-li psát v Perlu skriptíky, které budou pracovat s Internetem, obstarejte si knihovny „libnet“ a „libwww“ (LWP). Zkuste si man lwp
nebo man lwpcook
, kde je množství příkladů na přenos dat přes WWW v Perlu.
Hromadné nahrazování textu
K nahrazování textu v souborech pomocí regulárních výrazů slouží primárně příkaz sed
. Stejně dobře jako sed
(možná i lépe) můžete použít i interpret Perlu.
Hromadné nahrazování textu v souborech pomocí Perlu: perl -p -i -e 's/něco/cosi/g' soubor |
Předcházející jednořádkový příkaz nahradí v souboru soubor
všechny výskyty řetězce něco
řetězcem cosi
. Zápis s/.../.../g
je regulární výraz popisující, jak se má změna provést. Regulární výrazy jsou velmi silný nástroj, více se o nich dozvíte na man perlre
nebo v článcích pana Satrapy.
Parametr soubor
nemusí být jen název jednoho souboru. Klidně můžete použít „žolíky“ k vybrání několika souborů. Změny se potom dotknou každého z nich.
Chcete-li mít jistotu, že něco nepokazíte, můžete si všechny měněné soubory nechat zálohovat. Zadejte jen bezprostředně za volbu -i
příponu záložních souborů a Perl vám záložní kopie vytvoří automaticky.
Nahrazení řetězce ‚main.html‘ řetězcem ‚index.html‘ ve všech souborech s příponou *.html (záloha se provede do *.bak): perl -p -i.bak -e 's/main\.html/index\.html/g' *.html |
Dejme tomu, že v aktuálním adresáři máme soubory index.html, main.html, download.html, products.html
a prices.html
. Aplikujeme-li na ně předcházející příkaz, ve všech zmíněných souborech se vyhledá řetězec main.html
a nahradí se řetězcem index.html
. Původní soubory se budou zálohovat do souborů index.html.bak, main.html.bak, download.html.bak, products.html.bak
a prices.html.bak
.
Pokud cokoliv nefunguje
Je-li skriptík napsaný v Perlu, musíte mít pochopitelně jazyk Perl v počítači nainstalován. První řádek každého souboru systému říká, kde má hledat program, který kód zpracuje. Špatně zadaná cesta může být druhou příčinou, proč něco nefunguje. (Cestu k programu obvykle zjistíte příkazem which jméno_programu
.)
Další informace hledejte třeba na manuálových stránkách Perlu: man perl
nebo ještě lépe perldoc perl
.
Disclaimer
V žádném případě si nedělám nárok, že zde uvedený způsob řešení problémů je jediný možný, natož pak nejvýhodnější. Jistě někdo najde sto padesát dalších způsobů, jak zde popsané problémy řešit a devadesát jich bude lepších, než ty moje.
Jistě jste si také všimli, že všechno je napsáno v Perlu. Je to proto, že tento jazyk se mi líbí a mnohé věci se v něm řeší snadněji, než přímo v shellech. V žádném případě však nechci nabádat nikoho, kdo se Perlu štítí, k tomu, aby si jej instaloval jenom proto, aby mohl používat tyhle utilitky. (Pro ty z vás, kteří nemají Perl v lásce mám domácí úkol: přepsat všechno v příkazech nějakého shellu. :-)