Uživatel:Milda/skripty
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.jpg
až ptdc0115.jpg
na
005.jpg
až 067.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.