Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: karlitos 17 Března 2010, 11:43:43
-
Zdravim
Mam sbirku knizek - je jich nekolik stovek -ve formatu PDB, s timto formatem si ale neporadi moje ctecka (Foxit eSlick). Zkousel jsem uz driv ruzne zpusoby konverze, ale pokazde mi to zmrsilo diakritiku. Kdyz jsem si jendu z tech knizek otevrel ve fbreaderu, zjistil jsem ze kodovani je windows-1250 - stredoevropske - jazyk cestina. Mam nainstalovany program calibre, dival jsem se do manualu (http://calibre-ebook.com/user_manual/cli/ebook-convert-7.html#pdb-input-to-epub-output) a nasel nakonec reseni :
ebook-convert /media/data/eBooks/knizka.PDB /home/karlitos/Desktop/test.epub --input-encoding windows-1250
No a svete div se, ale jak calibre ebok-viewer tak i fbreader po konverzi do .epub formatu ukazuji diakritiku v poradku. No a ted muj problem : tech knizek jsou stovky, jsou razeny stylem : ebooks/nazev_autora/tituly . Takze bych potreboval skript ktery by rekurzivne prosel cely adresar ebooks a u kazde knizky provedl konverzi podle vyse uvedeneho prikazu a vyslednou knizku ulozil do ebooks2/nazev_autora/titul
Neco jako
IF dalsi adresar existuje
FOR vsechny knizky v nem DO
ebook-convert cesta_k_titulu.pdb /media/data/ebook2/cesta_k_titulu_epub --input-encoding windows-1250
Snazim se snazim ale tohle proste v bashi nedam, tak moc prosim nekoho zkusenejsiho o pomoc.
diky K
-
Možná by se to dalo vyřešit jednoduše - použít find k nalezení knih a pustit na ně ten ebook-convert. Například (hrubý nástřel):
find *.pdb | while read file
do
ebook-convert $file
done
Berte to opravdu jenom jako inspiraci, v BASHi jsem dělal před hodně dlouhou dobou :))
-
Tak trochu jsem googlil a myslim ze inspiraci by mohl byt tenhle prispevek (http://forum.mflenses.com/bash-recursive-file-rename-for-linux-nerds-t7077.html)
#!/bin/sh
convert_ebooks()
{
for file in "$1"/*; do
if [ -d "$file" ]; then
convert_ebooks "$file"
else
dirname=`dirname "$file"`
basename=`basename "$file"`
singlename=${basename%.*}
beg_name=${basename:0:4}
extension=${basename##*.}
# If extension is pdb
if [[ "$extension" == "pdb" ]]; then
ebook-convert $dirname/ .... ########
Tak a tady uz dal nevim ######
fi
done
}
for dir in $@; do
dirpath="$PWD/$dir"
if [ -d "$dirpath" ]; then
echo "Dir: $dirpath"
rename_recursive "$dirpath"
fi
done Ale pevne verim ze i tohle je moc slozity zpusob a navic to stejne nedam dohromady. Takze moc prosim o zasah shora ;)
-
@karlitos
to co psal stenliq je imho pro tve ucely uplne dostacujici - az teda na chybu toho findu, ma to byt "find . -name '*.pdb'" (popr misto tecky / nebo ~)
-
No dobre a jak zajistim to aby se mi konvertovane knihy ulozily presne podle puvodni struktury jen do jineho adresare ? A aby to zkonvertovalo jen knihy v danem adresari ?
-
find . -name '*.pdb'
Ta tečka tam znamená prohledávaný (tečka znamená současný) adresář. Takže knihy pouze v jednom adresáři a jeho podstromu vyhledáte např. konkrétním zadáním find /home/karlitos/knihy -name '*.pdb'.
Pokud chcete ukládat knihy do jiného adresáře se stejnou adresářovou strukturou, uděláte to zadáním jiného parametru tomu ebook-convertu.
Nevím přesně, který příkaz to dělá (někdo upřesněte :))), ale zjistíte si, kde se nachází daná .pdb kniha a například pomocí sedu upravíte cestu tak, aby se to celé ukládalo do jiného adresáře (např. ebook2 místo ebook). Pokud se nepletu, tak i find dokáže vypsat celou cestu k souboru, takže tím by se to dalo vyřešit.
-
Diky za vysvetleni. Opravdu mi to vyhodilo vetsinu titulu i s cestou. Nektere tituly ale maji vyjmecne i jine koncovky, treba pcr. SLo by to poresit nejakym OR operatorem ?
find . -name '*.pdb' OR '*.pcr' OR ... ?
Jinak syntaxe toho konvertoru je : ebook-convert cesta_k_titulu/kniha.pdb kam_se to_ma_ulozit/kniha.epub --input-encoding windows-1250
No ale ja bych nerad aby mi to ty knizky davalo do stejneho hlavniho adresare ebooks, rad bych aby je to davalo pri zachovani struktury do adresare ebooks2. Aby to vzalo tu cestu k titulu a na zacatek pripojilo /media/data/ebooks2 a s koncovkou epub
Tohle mi treba vyhodi find :
./Lévi, E/Lévi_Éliphas-Klíč_k_velkým_tajemstvím.pdb
./Dickens, Ch/Dickens Charles-Oliver Twist.pdb
./Burroughs, ER/Burroughs_Edgar_Rice-6-Šílený_vědec_na Marsu.pdb
Jak z toho vytahnu JEN tu strukturu adresaru + jmeno ? tedy napriklad : Burroughs, ER/Burroughs_Edgar_Rice-6-Šílený_vědec_na Marsu Ten druhy argument ebook-convertoru podle sve koncovky (epub, pdf ...) urcuje totiz vystupni format.
Diky moc za rady K
-
S první částí vám mohu poradit hned:
find . -name '*.pdb' -o -name '*.pcr'
mělo by to fungovat hned.
Na tu další část se kouknu, až budu u nějaké linuxové mašiny...
-
Tak vyhledat soubory podle pripon - i vice neni problem, ale ten zbytek jsem stale nevyresil. Zkousel jsem i nejake jine skripty ktere jsem si nasel prez google, ale moje znalost bashe je bohuzel prilis slaba. Koukam ze skoro bude jednodussi to udelat prez javu nebo matlab - ty trochu ovladam , akorat i to prijde jako prasarna.
-
Zkopíruj skript a ulož pod nějakým názvem:
#!/bin/bash
echo "Tento skript provádí v zadané složce rekurzivní převod souborů z formátu PDB, PRC nebo TXT do formátu EPUB."
if [ -z $1 ]; then echo "Nápověda: Jako parametr zadej název složky obsahující soubory určené pro převod. Pro zadání aktuální složky uveď jako parametr './'"; exit 0; fi
echo "Pozor! Po převodu dojde ke smazání souborů v původním formátu."
echo "Chceš zahájit převod? (1/2)"
select an in "Ano" "Ne"; do
case $an in
Ano )
find "$1" -depth -name '*' | while read file; do
folder=$(dirname "$file")
sourcefile=$(basename "$file")
name=$(basename "${file%.[PpPpTt][DdRrXx][BbCcTt]}")
if [ "$sourcefile" != "$name" ]; then
echo "#######################################################################"
echo "Zahájen převod souboru $sourcefile"
echo "#######################################################################"
ebook-convert "$folder/$sourcefile" "$folder/$name.epub" --input-encoding windows-1250 --no-default-epub-cover </dev/null
rm "$folder/$sourcefile"
fi
done;
break;;
Ne )
echo "Převod byl zrušen."
exit;;
esac
done
Skript je třeba nastavit jako spustitelný pomocí: chmod +x <název_skriptu>
Spouští se: ./<název_skriptu> <název_složky>
Pokud chcete projet aktuální složku, tak parametr názvu složky je: ./
Upozorňuji, že po konverzi se smažou původní soubory, takže je lepší si udělat zálohu.
Samozřejmě je předpoklad nainstalovaného Calibre:
sudo apt-get install --no-install-recommends calibre
-
Zdravím,
potřeboval bych taky poradit.Používám pro převod "*.pdb to *.txt"
txt2pdbdoc -d *.pdb | iconv -f cp1250 -t utf8 > soubor.txt
ale jde mi o to, výstup je "soubor.txt" jak docílit aby se pojmenoval po vstupním souboru.
A ještě jedna otázka dalo by se toto vsunout do kotextového menu souboru v Dolphinoví?
Díky
-
file="soubor.pdb"
txt2pdbdoc -d "$file" | iconv -f cp1250 -t utf8 > "${file%.pdb}.txt"
http://www.omgubuntu.co.uk/2011/11/making-dolphin-even-better-add-service-menus
http://flexible.xapient.net/?p=461
http://www.sharpley.org.uk/node/3
-
to pacholik
file="soubor.pdb"
txt2pdbdoc -d "$file" | iconv -f cp1250 -t utf8 > "${file%.pdb}.txt"
tohle bohužel vůbec nefunguje :'(
výpis
pavel@pavel-mint ~/Share $ file="soubor.pdb"
pavel@pavel-mint ~/Share $ txt2pdbdoc -d "$file" | iconv -f cp1250 -t utf8 > "${file%.pdb}.txt"
txt2pdbdoc: can not open soubor.pdb for input
-
No tak tam asi místo soubor.pdb napiš soubor kterej chceš konvertovat. Nebo možná jsi chtěl
file=*.pdb
-
to pacholik
Děkuji za tvou pomoc, už jsem dosáhl kýženého výsledku, složením mého a tvého příkazu
txt2pdbdoc -d *.pdb | iconv -f cp1250 -t utf8 > "${file%.pdb}.txt"
Teď to funguje tak jak jsem si představoval, vezme jakýkoliv *.pdb načte jeho název překóduje
a převede do txt a hlavně pojmenuje po původním pdb.
Teď se budu snažit pochopit jak to dostat do toho kontextového menu.
-
To může správně pojmenovávat jenom pro jeden soubor, pro ten, kterej sis zapsal do proměnné $file. Správně by mělo být opravdu
file="*.pdb"
txt2pdbdoc -d "$file" | iconv -f cp1250 -t utf8 > "${file%.pdb}.txt