Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Uran 12 Října 2011, 09:45:27
-
Pouzivam e-link ctecku a resil jsem problem jaky zvolit system toho co chci precist. Zkousel jsem calibre, ale ten mi prisel prilis slozity. Nakonec jsem skoncil u kombinace symlinku jejich konverze pomoci unoconv v prostredi cli (bash, sed, rsync, ...).
V zasade mam slozku "/home/"$USER"/Knihy/Knihovna" ze ktere smeruji symlinky do "/home/"$USER"/Knihy/Precist/" nasledne konvertuji do takoveho "meziskladu" "/home/"$USER"/Knihy/Konverze/" a nasledne synchronizuji, pokud je pripojena, se cteckou.
Skript je funkcni (snad i nekomu poslouzi), ale asi neni moc efektivni. S bashem a gnu utils obecne zacinam tak budu vdecny za kazdou radu jak to monstrum zjednodusit, pripadne osetrit dalsi situace/problemy, ktere mi unikly.
#!/bin/bash
VSTUP="/home/"$USER"/Knihy/Precist/"
VYSTUP="/home/"$USER"/Knihy/Konverze/"
CYBOOK="/media/Cybook Gen3/eBooks"
find "$VYSTUP" -empty -exec rm {} \; # smaze prazdne adresare a soubory vznikle pri nekorektnim prevodu pomoci unoconv
find "$VSTUP" -type f -follow ! -iregex '.*\(doc\|docx\|rtf\|odt\)' | while read F #kopirovani souboru (mimo doc, docx, odt a rtf) do slozky "Konverze"
do if [ ! -e "`echo "$F" | sed 's#Precist#Konverze#'`" ]
then echo "Kopiruji "$F""
mkdir -p "`echo "${F%/*}" | sed 's#Precist#Konverze#'`" # nejak se mi nepovedlo pomoci cp vytvorit i prislusnou adresarovou strukturu tak to resim takto
cp "$F" "`echo "$F" | sed 's#Precist#Konverze#'`"
fi
done
find "$VSTUP" -type f -follow -iregex '.*\(doc\|docx\|rtf\|odt\)' | while read F
do if [ ! -e "`echo "${F%.*}.txt" | sed 's#Precist#Konverze#'`" ]
then echo "Konvertuji "$F""
mkdir -p "`echo "${F%/*}" | sed 's#Precist#Konverze#'`"
unoconv --stdout -f txt "$F" > "`echo "${F%.*}.txt" | sed 's#Precist#Konverze#'`" # konverze do txt vyuzivajici libreoffice
cstocs -i utf8 cp1250 "`echo "${F%.*}.txt" | sed 's#Precist#Konverze#'`" # konverze z utf8 do cp1250, ktere podporuje ctecka
fi
done
find "$VYSTUP" -iname '*.txt' | while read F # Konverze zbylych TXT souboru z UTF-8 do CP1250, ktere podporuje ctecka.
do if [ "`file "$F" | grep -o -i utf-8`" ]
then echo "Konverze "$F" z UTF-8 do CP1250"
cstocs -i utf8 cp1250 "$F"
fi
done
if [ -d "/media/Cybook Gen3" ] # pokud je pripojena ctecka tak se provede synchronizace
then echo "Synchronizuji se cteckou"
find "$CYBOOK" -empty -exec rm {} \; # smaze prazdne adresare a soubory vznikle pri nekorektnim prevodu pomoci unoconv
rsync --stats -av --size-only --exclude="*.mbp" --exclude="*.param" --delete "$VYSTUP" "$CYBOOK" # synchronizace a mazani duplicit s vyjimkou *.mbp a *.param
else echo "Ctecka neni pripojena"
fi
-
Tak hlavně odsazování a obecně přehlednost
http://cs.wikipedia.org/wiki/Styl_z%C3%A1pisu_programu#Odsazov.C3.A1n.C3.AD
Jinak z mého pohledu drobnosti
místo -exec rm jde použít rovnou -delete
bash umí nahrazovat řetězce sám, není potřeba sed (pattern substitution, viz man bash)
použil bych víc proměnných, třeba pro echo "${F%.*}.txt" | sed 's#Precist#Konverze#'
-
Tak hlavně odsazování a obecně přehlednost
http://cs.wikipedia.org/wiki/Styl_z%C3%A1pisu_programu#Odsazov.C3.A1n.C3.AD
Jinak z mého pohledu drobnosti
místo -exec rm jde použít rovnou -delete
bash umí nahrazovat řetězce sám, není potřeba sed (pattern substitution, viz man bash)
použil bych víc proměnných, třeba pro echo "${F%.*}.txt" | sed 's#Precist#Konverze#'
Ok dekuji ten parametr -delete jsem nejak prehlidl. Substituci v bashi nastuduji. :) Prehlednost na tom zapracuji.
Jinak nejsou v tom skriptu nejake neosetrene chyby/situace? Preruseni behem kopirovani/konverzi, chovani pri odpojeni ctecky behem synchronizace, ...?