Hlavní navigace

Chytrému napověz...

Michal Burda

V tomto článku si ukážeme, jak si ulehčit práci s počítačem a některé rutinní záležitosti zautomatizovat. Sesbíral jsem pro vás pár jednoduchých skriptíků, které dokážou výrazně ulehčit práci. Jejich použití zvládnou i začátečníci a ty zkušenější z vás třeba alespoň inspirují. Konkrétně jsem se zaměřil na kopírování disket, práci se soubory a Internetem.

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.

Tabulka č. 86
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:

Tabulka č. 87
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?“.

Tabulka č. 88
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čí.

Tabulka č. 89
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.

Tabulka č. 90
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.

Tabulka č. 91
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.bakprices.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. :-)

Našli jste v článku chybu?