Níže jsou jednoduché skriptíky nejčastěji v linuxovém shellu (používám bash), které jsem si pro své potřeby napsal a použil jako tzv. složený příkaz a většinou mi kvůli svému jednorázovému použití nestálo za to si je psát jako skript do souboru. Zde je publikuji z toho důvodu, abych je celé nebo kousky z nich někdy v budoucnu mohl znovu použít bez jejich opětovného vymýšlení, ale jsou samozřejmě k dispozici komukoliv dalšímu. I když jsem je spouštěl jako jeden dlouhý řádek, zde jsou pro přehlednost rozepsány na více řádků, vnitřky cyklů nebo podmíněných větvení odsazeny a také okomentovány.

Zkrácení velikosti souborů a úprava času jejich modifikace

editovat

Jednalo se o kusy ze streamu internetového rádia, u kterých jsem potřeboval ořezat přesah jednoduše tak, že jsem je zkrátil na 60 MB. Soubory obsahovaly v názvu datum ve tvaru YYYYMMDD, který byl využit pro konstrukci nového timestampu.

for i in *.ogg
  do
    # překopírujeme 60 MB z původního souboru do nového
    dd if=$i of=${i}_ bs=1048576 count=60
    # čas poslední modifikace nastavíme na původní datum + čas 17:35
    t=`echo $i | sed -e 's/[^0-9]*\([0-9]*\).*/\1/'`
    touch -t ${t}1735 ${i}_
    # průběžná kontrola
    ls -lh ${i}*
    # přejmenujeme jen tehdy, pokud je nový soubor dostatečně velký (mohlo například dojít místo na disku)
    [ `stat -c%s ${i}_` -ge 62900000 ] && mv ${i}_ $i
    # průběžná kontrola
    ls -lh $i
done

Interaktivní přejmenování souborů

editovat

Soubory mají název tvaru PREDPONA-DATUM.PRIPONA (přípona je jednotná pro všechny soubory, například ogg). Chceme je přejmenovat na název tvaru PREDPONA-DATUM-DODATEK.PRIPONA bez nutnosti zadávat desítky příkazů mv.

for i in *.ogg
  do
    echo -n $i " = "
    read dodatek
    j=${i%.ogg}
    mv -i $i $j-$dodatek.ogg
    ls -lh $j*
done

Ukončení všech procesů zadaného uživatele

editovat

Login uživatele jako první parametr skriptu. Pro správnou funkčnost vyžaduje, aby výstup příkazu ps -uuživatel obsahoval nejvýše pěticiferná čísla procesů v prvním sloupci.

if [ ".$1" != "." -a "$1" != root ]
  then
    kill `ps -u$1 | cut -c 1-5 | sed -e '/PID/d'`
    sleep 10s
    kill -9 `ps -u$1 | cut -c 1-5 | sed -e '/PID/d'`
fi

Vyčištění souborů s MD5 součty (Perl)

editovat

Při kopírování souborů na USB zařízení (externí disk, fleška) si pro kontrolu ukládám soubor s MD5 součty. Těchto souborů v záložní složce postupně přibývá, naopak některé již nepotřebné datové soubory mažu. Následující skriptík napsaný v Perlu projde všechny zadané soubory s MD5 součty a na standardní výstup pošle jen řádky týkající se existujících souborů.

foreach my $file (@ARGV) {
    open(FILE, $file) or next;
    print STDERR "zpracovávám soubor $file\n";
    while (my $s = <FILE>) {
        chomp $s;
        if ($s =~ /^[0-9a-f]+\s+(.*)/) {
            print "$s\n" if -f $1;
        }
    }
    close(FILE);
}

Příklad volání z shellu:

md5sum-vycist.pl *.md5 > md5sum.md5_

Hromadné přejmenování souborů ze skeneru

editovat

Přejmenuje nepříliš pěkné názvy souborů ze skeneru nebo digitálního foťáku na souvislou řadu čísel (typicky čísla stran v knize). Netestuje existenci výchozích souborů, ale obsahuje ochranu proti nechtěnému přepsání cílového souboru (pomocí parametru -i příkazu mv.

Použité parametry a formátovací masky pro příkaz printf:

from
počátek číselné řady výchozích názvů
to
počátek číselné řady cílových názvů
last
konec souvislé číselné řady cílových názvů
ptdc%04d.jpg
maska pro generování názvu souboru typu ptdc0001.jpg (čtyřciferné číslo podle potřeby doplněné zleva nulami)
%03d.jpg
maska pro generování názvu souboru typu 001.jpg (trojciferné číslo podle potřeby doplněné zleva nulami)

Následující příklad přejmenuje soubory ptdc0053.jpgptdc0115.jpg na 005.jpg067.jpg.

from=53
to=5
last=67
while [ $to -le $last ]; do
  pfrom=`printf ptdc%04d.jpg $from`
  pto=`printf %03d.jpg $to`
  mv -i $pfrom $pto
  from=$((from+1))
  to=$((to+1))
done

Hromadná rotace naskenovaných stránek

editovat

Po naskenování bylo potřeba zrotovat liché stránky doleva, sudé doprava, současně se provede konverze do odstínů šedi. Bohužel názvy souborů vytvořené předchozím skriptem (001.jpg) jsou výborné pro alfanumerické řazení, po vyextrahování čísla z názvu (001) nastává problém, kdy shell řetězce začínající nulou považuje za čísla v osmičkové soustavě (což by pro rozlišení sudá/lichá zase nevadilo, ovšem u čísel obsahujících osmičku nebo devítku vrací chybu). Děkuji Tchořovi za nápad s fintou 10#řetězec, kterou se explicitně říká, že číslo po znaku # je desítkové.

for soubor in *.jpg; do
  cislo=10#${soubor%.jpg}
  cislo=$((cislo+0))
  rotace=270
  [ $((cislo%2)) -eq 0 ] && rotace=90
  mogrify -type Grayscale -rotate $rotace $soubor
done

Pokud by hodně záleželo na tom, aby nedocházalo k nové ztrátové kompresi, lze místo mogrify použít jpegtran, který umožňuje bezeztrátovou rotaci:

  ...
  jpegtran -rotate $rotace $soubor > $soubor.zrotovany && mv $soubor.zrotovany $soubor
  ...

Případně je možné rovnou vyvářet TIFF obrázky využitelné dalším skriptem. V tom případě je nutné místo mogrify použít convert:

convert -type Grayscale -rotate $rotace $soubor ${soubor%.jpg}.tiff


Jiná varianta (souvislá řada stránek, rotace stránek doleva a doprava se pravidelně střídá), zároveň ztmavujeme příliš světlé písmo:

stranka=257 # jaké číslo na výstupu dostane první stránka
rotace=270 # první stránku zrotovat doleva
for soubor in *.jpg; do
  convert -strip -rotate $rotace -gamma 0.65 -compress jpeg $soubor uprava/$stranka.tiff
  stranka=$((stranka+1))
  rotace=$((rotace+180))
  rotace=$((rotace%360))
done

Vytvoření vícestránkového PDF z obrázků

editovat

Pro potřeby OCR je nutné z jednotlivých obrázků vytvořit PDF dokument (nejlépe vícestránkový), který pak bude převeden na text. Předpokládáme, že jednotlivé obrázky jsou pojmenované trojciferným číslem a příponou tiff (001.tiff).

tiffcp ???.tiff vystup.tiff
tiff2pdf -z -o vystup.pdf vystup.tiff

Výběr stránek z PDF dokumentu

editovat
ghostscript -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER -dFirstPage=M -dLastPage=N -sOutputFile=vystup.pdf vstup.pdf

kde M a N jsou čísla první a poslední vybrané stránky.

Paralelní ripování CD a převod do Ogg Vorbis

editovat

Cílem je nezdržovat se při ripování čekáním na konverzi a zároveň nehromadit nekomprimované WAV soubory na disku.

Skripty jsou spuštěny ve dvou různých terminálů, synchronizují se pomocí „semaforů“ – vytváření dočasných souborů:

trackN.done
je dokončeno ripování N-té stopy do souboru trackN.wav, je možné jej konvertovat,
stop
ripování je hotovo.

Malý zádrhel spočíval v tom, že pokud druhý skript měl jako výstupní podmínku z vnějšího cyklu existenci souboru stop, pak někdy nezkonvertoval poslední stopu, pokud její ripování bylo rychlejší než převod předposlední stopy. Bylo nutné skript upravit tak, aby po zjištění souboru stop cyklus ještě jednou proběhl; to je zajištěno pomocnou proměnnou $repeat.

Skript 1 – ripování

editovat
first=1; last=13; device=/dev/scd0; i=$first; while [ $i -le $last ]; do cdparanoia -d $device $i -w track$i.wav; touch track$i.done; i=$((i+1)); done; touch stop

Skript 2 – převod

editovat
repeat=2; while [ $repeat -gt 0 ]; do for i in track*.done; do [ -f $i ] && oggenc -q 9 ${i%.done}.wav && rm $i ${i%.done}.wav; done; [ -f stop ] && repeat=$((repeat-1)); sleep 5s; done; rm stop

Převod MP3 nebo Ogg Vorbis do WAV

editovat

Pomocí mpg123:

mpg123 -w output.wav input.mp3

Pomocí ogg123:

ogg123 -d wav -f output.wav input.ogg

Pomocí mplayeru:

mplayer -ao pcm:file=output.wav input.mp3/ogg

Rozřezání a složení obrázku z dlaždic

editovat

Rozřezání obrázku

editovat

Složení obrázku

editovat

Máme obrázek rozřezaný na jednotlivé dlaždice čtvercového nebo obdélníkového formátu a chceme z nich složit původní obrázek. Pro zjednodušení předpokládejme, že rozměry všech dlaždic jsou stejné nebo že případné různé rozměry nemusíme řešit.

Můžeme použít nástroj montage z balíku ImageMagick. Následující kód poskládá dlaždice po řádcích do bloku M krát N dlaždic (M je počet sloupců neboli dlaždic na jednom řádku, N je počet řádků):

montage -mode concatenate -tile MxN dlazdice*.jpg vystup.jpg

Kód bude fungovat správně pro soubory pojmenované sekvenčně po řádcích, například levý horní roh dlazdice00.jpg, na horním řádku dále dlazdice01.jpg, dlazdice02.jpg atd., na druhém řádku dlazdice10.jpg, dlazdice11.jpg, dlazdice12.jpg atd., tzn. první číslice je číslo řádku shora, druhá číslice číslo sloupce zleva.

Pokud je označení řádku a sloupce v názvu souboru přehozeno, je situace o málo složitější – musíme si vhodně pohrát s expanzí shellu, abychom utilitě montage předali názvy dlaždic ve správném pořadí:

montage -mode concatenate -tile MxN dlazdice?{0,1,2,3,4,5,6,7,8,9}.jpg vystup.jpg

Pokud je řádků nebo sloupců více než 10, je princip stejný, musíme ale zajistit, aby pořadová čísla řádků (resp. sloupců) měla stejný počet číslic, tzn. místo 0, 1, …, 9, 10 atd. se používalo 00, 01, …, 09, 10, atd.