Видео смотреть бесплатно

Смотреть домашний видео

Официальный сайт all-remont 24/7/365

Смотреть видео бесплатно

ms_shark 25.02.2011 02:48

СкриптыОбработка FB2-книг

В рамках конкурса "Лучший скрипт" хочу предложить вам несколько скриптов по обработке FB2-книг. Скрипты не претендуют на оригинальность, но помогут вам немного освоиться с регулярными выражениями.

Предыстория: Муж осуществил наконец-то свою давнюю мечту - купил себе е-ридер. И заставил меня разгребать свою накопленую за пару лет библиотеку. Руками это можно было сделать, но слишком уж муторно. Поэтому я, по мере возникновения проблем, написала несколько скриптиков.
Под катом - подробности.

Скрипт №1 (использовать ОЧЕНЬ осторожно):
Теоритически, этот скрипт должен конвертировать книги с "неправильной" кодировкой в UTF-8, но на практике он "уничтожил" половину книг. Хорошо, что была резервная копия всей библиотеки. Хотя "неправильные" книги он все же привел в удобочитаемый вид.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"
tmp_dir="$(mktemp -d -p "$dir_name")"
find -iname '*.fb2' | while read input_file; do
base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"
echo "$input_file"
iconv -c "$input_file" > "$tmp_dir/$base_file"
sed -e '/encoding/s/windows-1251/UTF-8/g' -i "$tmp_dir/$base_file"
rm "$input_file"
mv "$tmp_dir/$base_file" "$base_dir"
done
rm -r "$tmp_dir"



Скрипт №2:
Этот скрипт разархивирует книги в zip-архиве. Т.к. часто содержимое zip-архивов содержит в себе "кракозябры", то этот скрипт просто берёт архив и преименовывает содержащуюся в нём книгу в имя архива (очень хорошо помогает при скачивании с Либрусека).
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"

tmp_dir="$(mktemp -d -p "$dir_name")"

find -iname '*.zip' | while read input_file; do

base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"

unzip_file="$(echo "$base_file" | sed 's/\.zip//g')"
unzip -p "$input_file" > "$tmp_dir/$unzip_file" && rm "$input_file"
mv "$tmp_dir/$unzip_file" "$base_dir"

done

rm -r "$tmp_dir"



Скрипт №3:
Книги, скачанные с Либрусека, обычно именуются в транслите. Переименовать одну книгу труда не составляет, но вот если их много - это уже проблема. Скрипт "транслитерирует" имена файлов. Конечно "транслит" немного туповатый, он не учитывает "мягкий знак", букву "ш" и "заглавные", но этому его легко обучить, правда тогда вы потеряете некоторые другие буквы :-)
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"

find -iname '*.fb2' | while read input_file; do

base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"

# Транслитерация
translit_file="$(echo "$base_file" | sed 's/^Kruz_//g' | sed 's/_/\ /g' | tr a-zA-Z A-Za-z | iconv -c -f koi-7 | sed 's/фб2/fb2/g')"
# sed 's/\.<0-9>\{6\}//g' |
# sed 's/Grof_//g' |

# Исправление букв
translit_file="$(echo "$translit_file" | sed 's/ыа/я/g')"
translit_file="$(echo "$translit_file" | sed 's/ыу/ю/g')"
translit_file="$(echo "$translit_file" | sed 's/ыо/ё/g')"
translit_file="$(echo "$translit_file" | sed 's/ыи/ы/g')"
translit_file="$(echo "$translit_file" | sed 's/ыы/ый/g')"
translit_file="$(echo "$translit_file" | sed 's/аы/ай/g')"
translit_file="$(echo "$translit_file" | sed 's/еы/ей/g')"
translit_file="$(echo "$translit_file" | sed 's/оы/ой/g')"
translit_file="$(echo "$translit_file" | sed 's/иы/ий/g')"
translit_file="$(echo "$translit_file" | sed 's/ж/в/g')"
translit_file="$(echo "$translit_file" | sed 's/зх/ж/g')"
translit_file="$(echo "$translit_file" | sed 's/сцх/щ/g')"
translit_file="$(echo "$translit_file" | sed 's/<Ц|ц>х/ч/g')"
translit_file="$(echo "$translit_file" | sed 's/тс/ц/g')"

echo "$translit_file"

mv "$input_file" "$base_dir/$translit_file"

done



Скрипт №4:
Книги, скачанные с Либрусека, в своем имени имеют какие-то цифры в конце. Этот скрипт эти цифры удаляет.
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"

find -iname '*.fb2' | while read input_file; do

base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"

translit_file="$(echo "$base_file" | sed 's/\.<0-9>\{6\}//g' | sed 's/\.<0-9>\{5\}//g' | sed 's/\.<0-9>\{4\}//g')"

echo "$translit_file"

mv "$input_file" "$base_dir/$translit_file"

done



Скрипт №5:
"Нормализационый" скрипт поможет привести в порядок имена файлов - удалит лишние пробелы в начале имени, двойные пробелы, пробелы "точкой расширения".
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
dir_name="${1}"
cd "${dir_name}"
find -iname '*.fb2' | while read input_file; do

base_dir="$(dirname "$input_file")"
base_file="$(basename "$input_file")"

# Убирает лишние пробелы
normalize_file="$(echo "$base_file" | sed 's/ / /g' | sed 's/^ //g' | sed 's/ $//g' | sed 's/ \./\./g')"
echo "$normalize_file"
mv "$input_file" "$base_dir/$normalize_file"

done



А теперь я попытаюсь показать, как все это я использовала на практике.
По понятным причинам первый скрипт я пропущу ;-)

Скрипт №2:
1
2
3
4
5
#ls /srv/nfs/export/library/tmp
Pratchett_Ploskiy_mir_1_Tsvet_volshebstva.75566.fb2.zip
#fb2_unzip.sh /srv/nfs/export/library/tmp
#ls /srv/nfs/export/library/tmp
Pratchett_Ploskiy_mir_1_Tsvet_volshebstva.75566.fb2



Скрипт №3:
1
2
3
#fb2_translit.sh /srv/nfs/export/library/tmp
#ls /srv/nfs/export/library/tmp
Пратчетт Плоский мир 1 Тсвет волсхебства.75566.fb2


Скрипт №4:
1
2
3
#fb2_delete_num.sh /srv/nfs/export/library/tmp
#ls /srv/nfs/export/library/tmp
Пратчетт Плоский мир 1 Тсвет волсхебства.fb2



Конечно эти скрипты не решают всех проблем, но здорово помогают в обработке библиотеки.
Если есть желание - их можно объединить в один большой скрипт, но тогда нельзя будет поручиться за результат обработки.
В любом случае - эти скрипты помогли в изучении регулярных выражений.


Тэги:
+ 8 -
Похожие Поделиться

solomenikm 25.02.2011 03:24 #
+ 2 -
Здорово! Чтобы было Очень здорово нужно чтобы файлы переименовывались согласно данным забитым в файл, а не обратной транслитерацией, но, как я понимаю, парсер xml это уже домашнее задание.
neclude 25.02.2011 06:36 #
+ 2 -
в первом скрипте вместо iconv можно использовать enca, тогда проблема с "уничтожением" части книг отпадет.
Daria 25.02.2011 07:01 #
+ 4 -
милая, твоя последовательность из sed'ов ужасна, достаточно просто разделить сами команды sed'ов точкой с запятой и можно отказаться от конвейеров и лишних sed'ов.
ms_shark 25.02.2011 11:10 #
+ 0 -
а можно пример? я подозревала, что можно оптимизировать, но не знала как именно.
например, как оптимизировать эту строку:
translit_file="$(echo "$base_file" | sed 's/\.<0-9>\{6\}//g' | sed 's/\.<0-9>\{5\}//g' | sed 's/\.<0-9>\{4\}//g')"
kstep 25.02.2011 11:11 #
+ 1 -
sed 's/\.<0-9>\{6\}//g; s/\.<0-9>\{5\}//g; s/\.<0-9>\{4\}//g'
Как-то так.
enot 25.02.2011 14:59 #
+ 0 -
а разве сед не поддерживает диапазоны вроде .\{4,6\} (любой символ от 4 до 6 раз) ? (лень проверять в мане, сейчас под вендой)
enot 25.02.2011 15:02 #
+ 1 -
вообще я считаю писать sed 'bla-bla-bla' | sed 'bla-bla-bla' | sed 'bla-bla-bla' - моветон. для этого нужно использовать одну конструкцию, или группировку {} в сложных случаях
рекомендую к прочтению
enot 25.02.2011 15:08 #
+ 0 -
\{i\} As *, but matches exactly i sequences (i is a decimal integer; for portability, keep it between 0 and 255 inclusive).
\{i,j\} Matches between i and j, inclusive, sequences.
\{i,\} Matches more than or equal to i sequences.

линк
Daria 25.02.2011 07:08 #
+ 2 -
это немного оффтоп, хотя и связано с FB2, и почти скрипт (кхе-кхе). нашла на днях себя calibre - эдакая программа управления своей библиотекой. мне понравилась, сижу "разбираюсь"
ms_shark 25.02.2011 11:03 #
+ 0 -
я пробовала Calibre - лучше уж ручками и скриптами :-)
ZED 25.02.2011 16:46 #
+ 0 -
calibre вещь хорошая, когда книги в разных форматах, это мощный комбайн, но только для FB2 его использовать неэффективно.
jh 25.02.2011 16:47 #
+ 0 -
для конвертирования в epub неплохо подходит
PaulRed 25.02.2011 11:10 #
+ 2 -
http://welinux.ru/post/852/ УМВР.
aurdino 25.02.2011 11:19 #
+ 0 -
ОФФТОП
С Либрусека ушел на Flibusta. Ничего не имею против монетизации Ларина (кто же кушать не хочет).
SergMarkov 25.02.2011 14:05 #
+ 1 -
Спасибо, а то все руки не доходили разобрать сказанную базу именно с либрусека именно по причине муторности этого занятия
:-) ) Восхитило - Пратчетт Плоский мир 1 Тсвет волсхебства.fb2
ZED 25.02.2011 16:44 #
+ 0 -
Для работы с FB2 лучше использовать MyRulib и никакие скрипты не понадобятся. Скрипт №2 ваще не нужен, все читалки прекрасно читают архивы.
ms_shark 25.02.2011 21:29 #
+ 1 -
все читалки прекрасно читают архивы

угу.. расскажите это Ergo
ZED 25.02.2011 22:14 #
+ 0 -
Чтож, придется поплакать над ущербностью некоторых дешевых читалок.
ms_shark 25.02.2011 23:27 #
+ 1 -
оп-с!! а за что минус?!
неужто я виновата, что некоторые фирмы выпускают ущербные ридеры?!
минусуйте Эрго, а не меня!!

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн