#!/bin/sh # funkce pro uklizeni(pousti se pri zabiti) uklid() { echo uklizim... rm /tmp/filelist.*.$$ 2> /dev/null rm /tmp/xml.edscript.$$ 2> /dev/null rm /tmp/xmlfile.*$$ 2> /dev/null exit 1 } # funkce, ktera vypise napovedu help() { echo Napoveda: echo "xmlpopis [volby] cesta" echo " cesta urcuje koren stromu, jenz se ma prohledavat" echo echo "Volby:" echo " --store cesta - rika, kam se ma vysledek ukladat, standartne ./" echo " --style cesta - urcuje cestu k pouzivanemu css stylu, standartne prazdny" echo " --nodescent - zakaze zmenu cesty ke stylu" echo " --root soubor - jmeno korenoveho souboru" echo " -e prikaz - rika, ktery program se ma spustit pro ziskani informaci ze souboru" echo " --with-care - zakaze mazani jiz nepotrebnych souboru, standartne vypnuto" echo " --recoff - vypne rekurzivni volani" echo " --string string - nastavi popis nezarazenych souboru" echo " --verbose - nastavi popis nezarazenych souboru" echo " --help nebo -? - vypise napovedu" exit 0 } # dojde-li k chybe, vola se tato funkce chyba() { echo Doslo k zavazne chybe, kocim! uklid } # fumkce pro vlozeni souboru, $1 je jmeno souboru, s vysledkem se pocita na stdoutu addfile() { [ "$verbose" ] && echo including file "$1" >&2 repared="`echo "$1" | sed "s:&:&:g"`" echo " " if [ "$spath" = "./" ]; then echo " " else echo " " fi [ "$definfo" ] && echo " $definfo" echo " file" if [ "$prgname" ]; then prgout="`$prgname "$1"`" [ "$prgout" ] && echo " $prgout" fi echo " " echo } # funkce pro vlozeni adreasre, $1 je jmeno adresare, s vysledkem se pocita na stdoutu adddir() { [ "$verbose" ] && echo including directory "$1" >&2 repared="`echo "$1" | sed "s:&:&:g"`" echo " " echo " " [ "$definfo" ] && echo " $definfo" echo " directory" echo " " echo # rekurze if [ "$recursive" ]; then [ "$verbose" ] && echo entering directory "$1" >&2 # ukladam-li jinam a je-li treba vytvorit adresar [ ! -d "$spath/$1" ] && mkdir "$spath/$1" cd "$epath" || chyba # neni-li cesta ke stylu absolutni, musim ji opravit newstyle="$style" [ "`echo "$style" | sed "s:\(.\).*:\1:"`" != "/" ] && [ ! "$nodescent" ] && newstyle="../$style" # volam sam sebe $estr --store "$spath/$1" -e "$prgname" --style "$newstyle" $delete $verbose "$apath/$1" || chyba cd "$apath" || chyba fi } # funkce pro vlozeni neceho, o cem nevim, co to je addneco() { if [ "$1" != "$xmlfile" ] && [ "$1" ]; then if [ -f "$1" ]; then addfile "$1" elif [ -d "$1" ]; then adddir "$1" fi fi } # funkce pro zalozeni noveho souboru, zapise do stdoutu zacatek() { echo "" echo "" echo filetitle="`echo "$xmlfile" | sed "s:.*/\(.*\)\.xml:\1:"`" echo "" echo "" echo } # funkce pro dokonceni noveho souboru konec() { date="`date`" echo "$date" echo "" } # funkce ktera vrati prvni vec ze seznamu getfirst() { first="" if [ `cat /tmp/filelist.$inputstate.$$ | wc -l` != "0" ]; then first="`ed -s /tmp/filelist.$inputstate.$$ < /tmp/xml.edscript.$$`" else if [ "$inputstate" = "directory" ]; then # dosli adresare, je nacase brat soubory inputstate="file" changestate="true" [ `cat /tmp/filelist.$inputstate.$$ | wc -l` != "0" ] && first="`ed -s /tmp/filelist.$inputstate.$$ < /tmp/xml.edscript.$$`" fi fi } # inicializace promenych spath="./" epath="`pwd`" estr="$0" recursive="yes" # kdyby me chtel nekdo nahodou killnout trap uklid 2 3 while [ "$2" ]; do # ukladani xml-souboru jinam if [ "$1" = "--store" ]; then spath="$2" shift 2 fi # spousteni programu pro generovani daslich informaci if [ "$1" = "-e" ]; then prgname="$2" shift 2 fi # kde se ma hledat xmlstyl if [ "$1" = "--style" ]; then style="$2" shift 2 fi # kde se ma hledat xmlstyl if [ "$1" = "--string" ]; then definfo="$2" shift 2 fi # kde se ma hledat xmlstyl if [ "$1" = "--root" ]; then rootfile="$2" shift 2 fi # nemazou se polozky if [ "$1" = "--with-care" ]; then delete="--with-care" shift fi # vypne rekurzy if [ "$1" = "--recoff" ]; then recursive="" shift fi # vypne rekurzy if [ "$1" = "--nodescent" ]; then descent="--nodescent" shift fi if [ "$1" = "--verbose" ]; then verbose="--verbose" shift fi # vypise se napoveda if [ "$1" = "--help" ] || [ "$1" = "-?" ]; then help fi done if [ "$1" = "--help" ] || [ "$1" = "-?" ] || [ ! "$1" ]; then help fi cd "$spath" || chyba spath=`pwd` apath="$1" cd "$epath" || chyba cd "$apath" || chyba apath="`pwd`" xmlfile="`pwd`.xml" [ "$rootfile" ] && xmlfile="`pwd`/$rootfile" xmlfile="$spath/`echo "$xmlfile" | sed "s:.*/::"`" inputstate="directory" # inicializace pomocnych souboru echo 1 p > /tmp/xml.edscript.$$ echo 1 d >> /tmp/xml.edscript.$$ echo w >> /tmp/xml.edscript.$$ echo q >> /tmp/xml.edscript.$$ echo "s:^: :" > /tmp/xml.sedscript.$$ echo "// s: ::" >> /tmp/xml.sedscript.$$ # samotny program # zapisu si seznam souboru ls -A1p | sed -n "s:/$::p" | sort > /tmp/filelist.directory.$$ ls -A1p | grep -v "/" | sort > /tmp/filelist.file.$$ # zalozim si novy xml, kam budu ukladat vysledky zacatek > /tmp/xmlfile.$$ # prectu si prvni polozku getfirst # ezistuje-li jiz soubor s popisem, pokusim se nacist polozky z nej if [ -f "$xmlfile" ]; then while read tmp; do # jsem-li uz mezi polozkami if [ "$activ" ]; then # jsem uvnitr polozky a kopiruji jeji obsah if [ "$copy" ] && [ "$tmp" != "" ]; then echo "$tmp" >> /tmp/xmlfile.copy.$$ # obsah zkopirovan, kontroluji, jestli v te polozce nebyl nazev souboru, ten by se mi moh hodit tmp2="`echo "$tmp" | sed -n "s:.*]*>\(.*\).*:\1:p"`" [ "$tmp2" ] && filename="$tmp2" # kontroluji, jestli v te polozce nebyl typ, ten by se mi moh hodit tmp2="`echo "$tmp" | sed -n "s:.*\(.*\).*:\1:p"`" [ "$tmp2" ] && filetype="$tmp2" fi # zacina nova polozka if [ "$tmp" = "" ]; then # nastavim kopirovaci mod copy="yes" # smazu starej buffer rm /tmp/xmlfile.copy.$$ 2> /dev/null # dozapisu do novyho echo "" > /tmp/xmlfile.copy.$$ fi # skoncila polozka, je cas to vsechno zapsat if [ "$tmp" = "" ]; then # skoncil-li jsem se vsemi adresari z puvodniho XML a zbyli-li mi jeste nejake nove adresare v souborech, dovyberu je if [ "$filetype" = "file" ] && [ "$inputstate" = "directory" ]; then while [ "$changestate" ]; do addneco "$first" >> /tmp/xmlfile.$$ getfirst done fi # zkusim, nepribylo-li neco, co by melo prijit pred kopirovanou vec while [ "$first" \< "$filename" ] && [ "$filetype" = "$inputstate" ] && [ "$first" ]; do addneco "$first" >> /tmp/xmlfile.$$ getfirst done copy="" # mam-li soubor v seznamu kandidatu na nove prichoziho, musim ho vyhodit [ "$first" = "$filename" ] && getfirst # existuje -li soubor, jehoz popis jsem kopiroval, je nacase zapsat ho do vysledneho xml if [ -e "$filename" ]; then cat /tmp/xmlfile.copy.$$ | sed -f /tmp/xml.sedscript.$$ >> /tmp/xmlfile.$$ echo " " >> /tmp/xmlfile.$$ echo >> /tmp/xmlfile.$$ else if [ ! "$delete" ]; then # pokud nexistuje, je to adresar a je to povoleno, je treba odstranit zbytky po nem (pokud je to soubor, tak ho jen nepridam) [ "$filetype" = "directory" ] && rm -fr "$spath/$filename" else # pokud je odstranovani zakazano, prida se tag odstraneno cat /tmp/xmlfile.copy.$$ | sed -f /tmp/xml.sedscript.$$ > /tmp/xmlfile.new.$$ echo " yes" >> /tmp/xmlfile.new.$$ echo " " >> /tmp/xmlfile.new.$$ echo >> /tmp/xmlfile.new.$$ cat /tmp/xmlfile.new.$$ | uniq >> /tmp/xmlfile.$$ fi fi fi # dosli-li polozky, je nacase ukoncit kopirovani a vypnout hledani if [ "$tmp" = "" ]; then activ="" copy="" fi # pokud jsem jeste nezacal prohledavat polozky, mel bych zjistit, jestli bych s tim nemel zacit else [ "$tmp" = "" ] && activ="yes" fi done < "$xmlfile" fi # pokud mi zbyli jeste nejaky nezarazeny soubory, zaradim je ted while [ "$first" ]; do addneco "$first" >> /tmp/xmlfile.$$ getfirst done # zapisu konec a umistim vysledny soubor konec >> /tmp/xmlfile.$$ [ -f "$xmlfile" ] && rm -f "$xmlfile" 2> /dev/null mv /tmp/xmlfile.$$ "$xmlfile" || chyba # uklidim zbytek rm /tmp/filelist.*.$$ 2> /dev/null rm /tmp/xml.*script.$$ 2> /dev/null rm /tmp/xmlfile.*$$ 2> /dev/null echo soubor \""$xmlfile"\" vytvoren >&2