Удаление дублей из архивов по 1000 книг.

Есть такая программа myhomelib. Для работы использует архивы либрусека. В этих архивах примерно 20% дублей. В связи с этим возникает вполне закономерное желание эти дубли убрать. pkn написал для этой цели скрипт. Скрипт перловый.
Перл можно найти тут, скрипт тут. Скрипт создает копии зип архивов, с полным сохранением структуры и имен файлов, но без дублей.
Как его запустить?
Устанавливаем перл. По умолчанию ставится C:\Perl\
Скачиваем и копируем скрипт в папку C:\Perl\bin\. Переименовываем его в kop-inp-zip-dedead.pl
Качаем списки и распаковываем их в папку папку librusec_update_lang, в корень диска C:
Копируем архивы либрусека в E:\Lib.rus.ec - у меня так, если у вас по другому, нужно в параметрах скрипта прописать другой путь. В пути не должно быть пробелов и русских букв.
Жмем пуск\выполнить, там пишем cmd и жмем enter.
Откроется командная строка.
Там пишем cd c:\ - это место куда будут копироваться архивы.
После этого выполняем следующую команду C:\Perl\bin\perl5.8.0.exe C:\Perl\bin\kop-inp-zip-dedead.pl C:\librusec_update_lang E:\Lib.rus.ec ru
Где C:\Perl\bin\perl5.8.0.exe - путь к exe перла.
C:\Perl\bin\kop-inp-zip-dedead.pl - путь к скрипту.
C:\librusec_update_lang - путь к спискам из myhomelib.
E:\Lib.rus.ec - путь к архивам либрусека.
ru - оставить только русские книги. Если написать all - оставит все языки.
Идем пить чай. Работа скрипта, в зависимости от мощности вашего компьютера, займет 20 - 30 минут. До обработки, архивы либрусека занимают 18.4 Гб. После обработки 13.8 Гб.

Комментарии

Bullfear написал:
Есть такая программа myhomelib. Для работы использует архивы либрусека. В этих архивах примерно 40-60% дублей. В связи с этим возникает вполне закономерное желание эти дубли убрать. Вопрос в том как это сделать. Есть списки myhomelib, в которых отмечены удаленные книги, есть архивы. Звезды подсказывают мне, что поудалять книги скриптом совсем не сложно, но у меня не хватает знаний, чтобы самому написать такой скрипт. Кто может с этим делом помочь?

Я могу попробовать. Но это будет небыстро - пока что всё свободное время уходит на возню с библиотекой Пухлого. Если хочешь, прицепи к посту списки myhomelib, архивы Либрусека у меня, естественно, есть.

Bullfear написал:
...

Кажется, работает. Пробую прикрепить к посту.

Ага, вроде прикрепилось. Скрипт перловый. Принцип работы и как запускать примерно так же, как описано вот тут: http://lib.rus.ec/node/111496#comment-21747

В Либрусечьих архивах по тысячам (112214 файла внутри зипов) отлавливает: Dead: 17946

Спасибо. Теперь вопрос. Как должна выглядеть командная строка для его запуска? Как я понял ему надо прописать три вещи: путь к спискам, путь к архивам либрусека и путь куда это сохранять. В каком порядке это прописывать?
Вопрос номер два.
Что получим на выходе - копии архивов, но уже без левых файлов или просто кучу распакованных файлов?

Bullfear написал:
Спасибо. Теперь вопрос. Как должна выглядеть командная строка для его запуска? Как я понял ему надо прописать три вещи: путь к спискам, путь к архивам либрусека и путь куда это сохранять. В каком порядке это прописывать?
Вопрос номер два.
Что получим на выходе - копии архивов, но уже без левых файлов или просто кучу распакованных файлов?

В командной строке скрипту нужно сказать две вещи: директорий откуда брать (распакованные) майхоумлибовские INP-файлы; и директорий откуда брать либрусечьи ZIP-файлы, именно в этом порядке. Результат скрипт пишет в текущий директорий.

Результат - это копии входных либрусечьих зипов, но без мертвых файлов внутри, и поименованные по схеме: входной "1-1009.zip" становится "1-1009.dedead.zip". Если выходной файл уже существует, скрипт его перезаписывать не станет, скипнет и сообщит об этом.

Если запустить скрипт без параметров в командной строке, он скажет кратенькую напоминалку.

Пример:
U:\librusec-original-zips-by1000-dedead>C:\Perl\bin\perl.exe U:\perlscripts\kop-inp-zip-dedead.pl U:\myhomelib F:\librusec-original-zips-by1000

Здесь:
"U:\librusec-original-zips-by1000-dedead" - текущий директорий, сюда скрипт будет результат писать.
"C:\Perl\bin\perl.exe" - вызов интерпретатора Перла.
"U:\perlscripts\kop-inp-zip-dedead.pl" - файл скрипта, передаётся интерпретатору Перла.
"U:\myhomelib" - директорий откуда скрипту брать (распакованные) майхоумлибовские INP-файлы
"F:\librusec-original-zips-by1000" - директорий откуда скрипту брать либрусечьи ZIP-файлы

Прописал, запустил. Не в курсе, чего ему надо?

Bullfear написал:
Прописал, запустил. Не в курсе, чего ему надо?

Там не всё видно (чем картинку, лучше скопипейстить его вывод), но судя по выглядывающему краешку скрипт не нашёл ни одного зипа. Или ни одного мембера (файла) внутри зипов, но это менее вероятно. Скопипейсти вывод полностью, влкючая командную строку, тогда точнее можно будет сказать.

Как скопиейстить из командного окна Windows: правая кнопка->Mark, мышкой выделить всё что нужно, нажать Enter (или ещё раз правую кнопку). Потом в нужном окошке правая кнопка->Paste.

C:\>C:\Perl\bin\perl5.8.0.exe C:\Perl\bin\kop-inp-zip-dedead.pl C:\Program File
\MyHomeLib\LIBRUSEC_INP E:\lib
-------------------------------------------------------
cwd=C:/
Drive="C" Program name: "C:\Perl\bin\kop-inp-zip-dedead.pl" Run date: 07:58:04
/30/2009
DEBUG: arg[ 0]="C:\Program"
DEBUG: arg[ 1]="Files\MyHomeLib\LIBRUSEC_INP"
DEBUG: arg[ 2]="E:\lib"
DEBUG:[ 0] dir="C:\Program"
DEBUG:[ 1] dir="Files\MyHomeLib\LIBRUSEC_INP"
DEBUG:[ 2] dir="E:\lib"
DEBUG:[ 0] type="zip"
-------------------------------------------------------
Building [inp ] files list completed. Full list contains 0 files. Elapsed=0.000
00 seconds.
-------------------------------------------------------
Building [zip ] files list completed. Full list contains 0 files. Elapsed=0.000
00 seconds.
-------------------------------------------------------
Processing dir "Files\MyHomeLib\LIBRUSEC_INP", testing 0 zips...
DEBUG:koplib_test_zipfilelist: 0 zips given, 0 zips tested OK, 0 members.
Processing dir "Files\MyHomeLib\LIBRUSEC_INP", Found 0 zips, tested OK 0 zips,
ontent 0 members.WARNING: -----------------------------------------------------
------
+

------------------------------------------------------------
+

[ 0 of 0] WARNING_CALL zipff="" filef=""
WARNING: FATAL ERROR: Illegal division by zero at C:\Perl\bin\kop-inp-zip-dedea
.pl line 204.

FATAL ERROR: Illegal division by zero at C:\Perl\bin\kop-inp-zip-dedead.pl line
204.

[ 0 of 0] WARNING_CALL zipff="" filef=""
FATAL ERROR: Illegal division by zero at C:\Perl\bin\kop-inp-zip-dedead.pl line
204.

00 204 main::Die C:\Perl\bin\kop-inp-zip-dedead.pl
WARNING: 00 204 main::Die C:\Perl\bin\kop-inp-zip-d
dead.pl

00 204 main::Die C:\Perl\bin\kop-inp-zip-dedead.pl

[ 0 of 0] WARNING_CALL zipff="" filef=""
[ 0 of 0] zipff=""
aut_from_zip_fname_G=""
autf_from_zip_fname_G=""
auti_from_zip_fname_G=""
elapsed=0.015625

Bullfear написал:
C:\>C:\Perl\bin\perl5.8.0.exe C:\Perl\bin\kop-inp-zip-dedead.pl C:\Program File
\MyHomeLib\LIBRUSEC_INP E:\lib
-------------------------------------------------------
cwd=C:/
Drive="C" Program name: "C:\Perl\bin\kop-inp-zip-dedead.pl" Run date: 07:58:04
/30/2009
DEBUG: arg[ 0]="C:\Program"
DEBUG: arg[ 1]="Files\MyHomeLib\LIBRUSEC_INP"
DEBUG: arg[ 2]="E:\lib"

Понятно. Вот это, выделенное жирным (я также добавил "s" в "Files", видимо пропущена при копипейсте): C:\Program Files\MyHomeLib\LIBRUSEC_INP надо написать в кавычках, вот так: "C:\Program Files\MyHomeLib\LIBRUSEC_INP", потому что там пробел есть в имени директория Program Files.

Скопировал все, посмотрел на это и понял в чем косяк :) Короче скрипт не понимал что такое "program files". После перемещения myhomelib в корень С:, все заработало.
UPD. Написал и увидел твой коментарий. Ну тоже вариант :)

От первого архива осталось 30 мегабайт... В этом что-то есть :)

Bullfear написал:
От первого архива осталось 30 мегабайт... В этом что-то есть :)

Есть, но не так много, как кажется :) Дальше дублей будет всё меньше, на круг - удаляется процентов 20, не больше.

Такс. Помоему скрипт слегка глючит, я могу ошибаться, но похоже он удаляет некоторые вещи, которые удалять бы не надо и наоборот... Сходу - автор Аарон - При нажатой кнопке "скрыть удаленное" у него одна книга, при отжатой три. После чистки открываются все три.
Олди Генри Лайон "Реквием по мечте" - кнопка "скрыть удаленное" нажата, книга не открывается.

MyHomeLib извлекает файлы из архива не по имени, а по номеру. после удаления номера ясное дело поплыли. нужно теперь базу обновить, соотвествующие списки лежат здесь: http://forum.home-lib.net/viewtopic.php?p=2516#p2516

koreec написал:
MyHomeLib извлекает файлы из архива не по имени, а по номеру. после удаления номера ясное дело поплыли. нужно теперь базу обновить, соотвествующие списки лежат здесь: http://forum.home-lib.net/viewtopic.php?p=2516#p2516

Так... об этом я не подумал. Сделаю другой вариант скрипта, который вместо удаления из зипов мертвых файлов будет заменять их на файлы размером в один байт, так и размер уменьшится, и нумерация сохранится.

Update: Сделал версию с объединичением размера, ещё диагностики по мелочи добавил, прикрепил к посту.

Кстати, заметка для отметки: прикрепление файла к посту не срабатывает, если поле "Пояснение к файлу:" оставить пустым.

(подумав) Bullfear, протестируй эту версию, пожалуйста. У меня под рукой нет MyHomeLib, протестировать не могу, а там тоже может быть глюк - не факт, что процедура замены файла вставляет новый единичного размера файл точно на место старого в зипе. Если не на место, а добавляет в конец - то нумерация всё равно нарушится и в MyHomeLib тоже будут глюки.

на первый взгляд все работает хорошо.

Myhomelib не ругается, это гуд. Но есть несколько "кривых" файлов...
List of 18 BAD members:

NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/108296-109376.zip Member:Aleeksy_Alekseevic
h_Glushanovskiy_Stezya_charodeya.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/108296-109376.zip Member:Aleksey_Alekseevic
h_Glushanovskiy_Stezya_charodeya.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/109377-110395.zip Member:Hermann_Hesse_Sidd
hartha .fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/109377-110395.zip Member:German_Gesse_Narzi
├Я_und_Goldmund .fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/112398-113759.zip Member:Maykl_Krayton_Time
line.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/121102-122247.zip Member:Lev_Sergeevich_Yak
ovlev_ .fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/121102-122247.zip Member:Lev_Sergeevich_Yak
ovlev_Romantichnyiy_nash_imperator .fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/121102-122247.zip Member:Igor_Malin_ZAKON_B
OZhIY.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:E_V_Senina_KULTURN
YiY_RELYaTIVIZM.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:R_N_Volkoslavskiy_
Suschnost_ikonopochitaniya.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Aleksandr_Volkov_T
ayna_zabroshennogo_zamka.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Aleksandr_Volkov_S
em_podzemnyih_koroley.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Aleksandr_Volkov_Z
heltyiy_tuman.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:D_A_Kuznetsov_O_ch
em_umolchal_vash_uchebnik_Pravda_i_vyimyisel_┬аv_teorii_evolyutsii.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Ellet_Vaggoner_Opr
avdavshis_veroyu._Kommentariy_na_Poslanie_ap._Pavla_k_Rimlyanam.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Ellet_Vaggoner_Rad
ostnyie_vesti_Kommentariy_na_Poslanie_ap._Pavla_k_Galatam.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/122248-123010.zip Member:Irvin_U_┬аLattser_
V_POISKAH_MORALNOGO_ABSOLYuTA_Sravnitelnyiy_analiz_eticheskih_sistem.fb2
NOT_FOUND_IN_INPS:File:E:\Lib.rus.ec/125473-126782.zip Member:Zhurnal_Krasnaya_B
urda__Krasnaya_Burda_sbornik_1997-98_godov_.fb2

У всех этих файлов в имени есть квадратик. Подозреваю, что косяк в списках, хотя кто знает...
Кстати, небольшое пожелание. В следующих версиях скрипта(для убивания иностранцев :)), сделай пожалуйста так, чтобы архивы имели те же имена, что и оригинальные файлы. Переименование в dedead только вносит лишние проблемы(ибо копируется все равно в другую папку). Для себя решил эту проблему так - открыл вордом твой скрипт, нашел там строчку ".dedead.zip" и заменил на ".zip". Подозреваю, что это было примерно как с ломиком в истребитель, но лучше ничего не придумал :)

Уважаемый pkn, а можно еще добавить удаление книг не на русском языке - это еще процентов 10-15.

Evgeniy_V написал:
Уважаемый pkn, а можно еще добавить удаление книг не на русском языке - это еще процентов 10-15.

"Добавить" это в скрипт dedead не получится, потому что майхоумлибовские INP-файлы не несут информации о языке книги. Можно сделать отдельный скрипт. Но он будет способен удалить, или, лучше, объединичить размер внутри либрусечьих зипов, только fb2-файлов. Потому что для файлов других типов язык, опять же, неизвестен. Нерусских fb2-файлов, кажется, не так уж много, я не уверен - нужно ли это.

в принципе, можно поправить генератор inp-ов, что бы язык тоже указывался - в строке добавится еще один параметр. но вот насколько это нужно ...

koreec написал:
в принципе, можно поправить генератор inp-ов, что бы язык тоже указывался - в строке добавится еще один параметр. но вот насколько это нужно ...

Если бы генератор inp-ов обрабатывал и не-fb2 файлы, то, пожалуй, имело бы смысл, но, если я правильно понимаю, он работает только с fb2?

И кстати - откуда генератор inp-ов берёт информацию что данная книга удалена?

pkn написал:
koreec написал:
в принципе, можно поправить генератор inp-ов, что бы язык тоже указывался - в строке добавится еще один параметр. но вот насколько это нужно ...

Если бы генератор inp-ов обрабатывал и не-fb2 файлы, то, пожалуй, имело бы смысл, но, если я правильно понимаю, он работает только с fb2?
И кстати - откуда генератор inp-ов берёт информацию что данная книга удалена?

не правильно :-)
генератор работает с любыми файлами. если ему подсунуть usr* он сделает списки не-fb2
из базы либрусековской, там поле есть соответсвующее.

koreec написал:

не правильно :-)
генератор работает с любыми файлами. если ему подсунуть usr* он сделает списки не-fb2

О. Может, тогда и правда язык добавить, если, конечно, это несложно и его есть откуда взять?
koreec написал:

из базы либрусековской, там поле есть соответсвующее.

Эх, вот бы и мне научиться напрямую с либрусековскими SQL-таблицами работать...

pkn написал:
Эх, вот бы и мне научиться напрямую с либрусековскими SQL-таблицами работать...
http://www.php.net/download-docs.php

agrey написал:
pkn написал:
Эх, вот бы и мне научиться напрямую с либрусековскими SQL-таблицами работать...
http://www.php.net/download-docs.php

Это не совсем то... PHP, если я правильно понимаю, исполняется http-сервером, а сервера у меня нет и заводить его мне крайне не хочется. Мне бы научиться лазить в SQL-таблицы из Перла. В принципе, модули для этого в Перле, кажется, есть (а чего в Перле нет?), но это ж пару тысяч страниц учебников сгрызть надо... или хоть понадкусывать... ох-хо-хонюшки, да когда ж эта учёба кончится... уж пенсия не за горами, а всё грызть и грызть.

pkn написал:
PHP, если я правильно понимаю, исполняется http-сервером, а сервера у меня нет и заводить его мне крайне не хочется.
Ну, тот же XAMPP можно установить/снести за пару минут...

pkn написал:
Мне бы научиться лазить в SQL-таблицы из Перла.
http://perl.dp.ua/articles/intro_mysql.html - статья старая, но толковая.

pkn написал:

О. Может, тогда и правда язык добавить, если, конечно, это несложно и его есть откуда взять?

в понедельник сделаю.

сделал: http://home-lib.net/update/librusec_update_lang.zip язык - последний параметр.
новых архивов (добавленных вчера) там пока нет, я их еще сам не скачал.

koreec написал:
сделал: http://home-lib.net/update/librusec_update_lang.zip язык - последний параметр.
новых архивов (добавленных вчера) там пока нет, я их еще сам не скачал.

Сделал новую версию dedead-скрипта, прикреплена к этому посту.
Должна по идее работать и со "старыми" INP-файлами (без языка), и с новыми, с языком.
Язык скрипту нужно указывать третьим параметром в командной строке.
all - означает что все живые файлы будут записаны в выходной файл, на любом языке.
ru - означает что только живые файлы на русском языке будут записаны в выходной файл.
en - только живые файлы на английском,
... нуитеде.

Оп-паньки... скачал сейчас переделанные фб2-архивы по тысяче, 133502-134893 и 134894-136118, заглянул внутрь, а у них внутре filename из одного номера ID состоит. А dedead-скрипт-то как раз по filename ищет соответствующую строчку в INP-файлах... Если генератор INP-ов в filename (6-е поле) пишет именно filename из либрусечьего зипа, то будет скрипт работать и так. А вот если нет, то придётся что-то придумывать...

pkn написал:
Если генератор INP-ов в filename (6-е поле) пишет именно filename из либрусечьего зипа, то будет скрипт работать и так. А вот если нет, то придётся что-то придумывать...

все уже учтено.
только вот я вчера не заметил, что 135502-*.zip изменился. сейчас перекачаю, и обновлю списки (оба комплекта).

списки обновил.

Я думаю Вы уже заметили, что Larin поменял имена файлов в новых архивах, может есть смысл в еще одном скрипте для переименовывания файлов в старых архивах, согласно их ID в базе?

Evgeniy_V написал:
Я думаю Вы уже заметили, что Larin поменял имена файлов в новых архивах, может есть смысл в еще одном скрипте для переименовывания файлов в старых архивах, согласно их ID в базе?

Я не очень понимаю в чём смысл.

смысла нет. к тому же многие имена файлов в базе содержат левые символы, что приводит к проблемам при распаковке. ИМХО, замена на номера - это правильный ход.

Так я про это и говорю - заменить левые символы на номерные ID, но согласен, это лишнее, я вообще не уверен что удалять дубликаты из архивов будут (смогут) хотя бы 20% пользователей MyHomeLib.

лично я пользуюсь :-)

сделал себе облегченный вариант для ноута, там разница в 5 гиг заметна.
спасибо pkn за скрипт!

По сравнению с kop-inp-zip-dedead изменено очень сильно, практически это другой скрипт, поэтому другое название - kop-librusec-dedead. Основные характеристики:

1. Скрипт теперь не нуждается в INP-файлах от koreec, а работает напрямую с SQL-таблицами Либрусека.
2. Если файлов с SQL-таблицами у Вас нет, скрипт может сам их сгрузить прямо с Либрусека.
3. Неограниченный фильтр по формату (типу файлов) позволяет извлекать нужное и из не-фб2 либрусечьих зипов.
4. Неограниченный фильтр по языку.
5. Обработка mistyped - файлов с неправильно указанным форматом.
6. Добавлен приличный (ну, по Перловым меркам) хелп.

Во, и тут же следующая версия.
Версия 0.3.3. Добавлено: фильтр по автору фб2-файла; фильтр по версии фб-2 файла.

Таким образом такой вот запуск (см. EXAMPLES в хелпе):

kop-librusec-dedead.pl -dow -del C:\zi -f fb2 -fb2a rusec -fb2v 1.0 1.0

делает из зипов выборку непроапгрейденных Либрусек-китовских файлов.

Эмм... Что там насчет хэлпа? Мну наивный думал, что если запустить скрипт без параметров, оно покажет хэлп. Зря думал. Ну да ладно. Расковырял я его вордом и сложилась у нас патовая ситуация - скрипт не понимает русского, а я английского :) Напиши пожалуйста хэлп по русски, что-то мне подсказывает, что не я один такой неграмотный.
Кстати пожелание для следующей версии. Сделай пожалуйста, чтобы папка, куда будут записываться архивы, задавалась параметром. Тогда можно будет сделать ярлык, чтобы не вбивать каждый раз команды. Если его сделать сейчас, архивы будут складываются в папку с перлом, что не очень удобно.

Bullfear написал:

Эмм... Что там насчет хэлпа? Мну наивный думал, что если запустить скрипт без параметров, оно покажет хэлп.

Странно. Должен именно показывать хелп.

Bullfear написал:

Напиши пожалуйста хэлп по русски,

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

Bullfear написал:

чтобы папка, куда будут записываться архивы, задавалась параметром.

Оно так и есть.

Перевод хелпа:

NAME НАЗВАНИЕ

kop-librusec-dedead.pl - Сжимает удалённые/ненужные файлы в зип-архивах Либрусека для экономии места.

SYNOPSIS ЗАПУСК

kop-librusec-dedead.pl [options] dirzip [repeatable_options]

dirzip

Это директорий на вашем компьютере, из которого скрипт будет (рекурсивно) читать зип-архивы Либрусека.

OPTIONS ОПЦИИ

-help ИЛИ -h ИЛИ -?

Вывести подсказку.

-man ИЛИ -m

Вывести детальную подсказку.

-dirout ИЛИ -do path

Директорий куда писать файлы результата.
По умолчанию - текущий директорий.

-keepmistyped ИЛИ -keep

Некоторые файлы в зип-архивах Либрусека имеют указанный FileType, к примеру, .doc,
но на самом деле это запакованные (zip, rar) файлы с .doc внутри.
Опция -keep задаёт сохранение таких файлов в файлах результате.
По умолчанию такие файлы не сохраняются (считаются удалёнными).

-delete ИЛИ -del

Уничтожает ненужные файлы в файлах результата.
По умолчанию ненужные файлы не уничтожаются, а заменяются пустыми (размером в один байт).
ВНИМАНИЕ: опция -delete разрушит схему нумерации, используемую программой MyHomeLib.
НЕ пользуйтесь этой опцией, если не уверены.

SQL tables options: Опции относящиеся к SQL-таблицам:

-dirsql ИЛИ -ds path

Это директорий на вашем компьютере, из которого скрипт должен читать файлы SQL-таблиц Либрусека.
По умолчанию - текущий директорий.

-download ИЛИ -dow

Не читать SQL-таблицы из файлов, а сгрузить (в директорий dirsql) новую копию нужных SQL-таблиц с Либрусека.

Repeatable options: Повторяемые опции:

-language ИЛИ -l all|ru|en|...

Язык книг, файлы которых будут считаться "нужными", то есть будут сохранены в файлах результата.
Книги на всех других языках будут считаться "ненужными".
Опция повторяемая (см. ПРИМЕРЫ).
По умолчанию: all (все)

-format ИЛИ -f all|text|fb2|txt|doc|djvu|...

Формат (тип) файлов, которые будут считаться "нужными", то есть будут сохранены в файлах результата.
Файлы во всех других форматах будут считаться "ненужными".
По умолчанию: all (все)
text включает в себя 4 текстовых формата: fb2, txt, doc, rtf.
Любой другой формат трактуется как тип файла:
fb2 - означает, что только fb2-файлы нужны,
pdf - означает, что только pdf-файлы нужны,
-l fb2 pdf - означает, что только fb2- и pdf-файлы нужны,
и так далее.

-fb2authors ИЛИ -fb2a author1 [author2 [...]]

Список авторов fb2-файла (не книги!), которые трактуются как "нужные".
fb2-файлы всех других авторов будут считаться "ненужными".
По умолчанию: all (все)

-fb2versions ИЛИ -fb2v version_min version_max

Диапазон версий fb2-файла, которые трактуются как "нужные".
Опция требует два значения (минимальная и максимальная версии).
fb2-файлы с версией за пределами этого диапазона будут считаться "ненужными".
По умолчанию: all (все)

DESCRIPTION ОПИСАНИЕ

Этот скрипт удаляет ненужные файлы из зип-архивов Либрусека.

Скрипт читает нужные данные (FileName, FileType, Lang, Deleted)
из файлов SQL-таблиц Либрусека, и, ориентируясь по этим данным
и по заданным вами опциям, уничтожает (или заменяет файлами размером в один байт)
ненужные файлы в зип-архивах Либрусека.

Результат -меньшие по размеру зип-архивы Либрусека, записанные
в выходной директорий dirout.

Если выходной файл уже существует, он будет пропущен, а НЕ перезаписан.

Нужные скрипту входные данные - это SQL-таблицы Либрусека, и зип-архивы Либрусека.

SQL tables: SQL таблицы:

Скрипт будет читать нужные ему SQL-таблицы из заданного в опциях директория dirsql.
Файлы таблиц могут быть распакованными, или в арихиве .gz (файлы ищутся в этом порядке).

Или скрипт, если это задано опцией, может сгрузить новую копию таблиц прямо с сайта Либрусек.

Текущую версию всех SQL-таблиц Либрусека можно сгрузить отсюда: http://lib.rus.ec/sql/
Таблицы в формате MySQL dump. Список таблиц, нужных для работы этого скрипта:

lib.libbook.old.sql.gz
lib.libbook.sql.gz
lib.libfilename.sql.gz

Lib.rus.ec zip archives: Зип-архивы Либрусека:

Зип-архивы Либрусека содержат собственно файлы книг. Зип-архивы должны находиться
на вашем компьютере, в директории dirzip.

EXAMPLES ПРИМЕРЫ

kop-librusec-dedead.pl C:\librusec_zips

Прочитать SQL-таблицы из текущего директория,
зип-архивы из директория C:\librusec_zips
и вывести файлы результата в текущий директорий.
Результат будет содержать все "живые" (не удалённые на Либрусеке) файлы.

kop-librusec-dedead.pl -sd C:\in_sql C:\librusec_zips -l ru -f text

Прочитать SQL-таблицы из директория C:\in_sql,
прочитать зип-архивы из директория C:\librusec_zips
и вывести файлы результата в текущий директорий.
Результат будет содержать файлы: живые, на русском, в форматах fb2 txt doc rtf.

kop-librusec-dedead.pl -dow -od C:\out C:\zips -l en pl -f chm pdf djvu

Сгрузить новые SQL-таблицы в текущий директорий,
прочитать зип-архивы из директория C:\zips
и вывести файлы результата в директорий C:\out.
Результат будет содержать файлы: живые, на английском и польском, в форматах chm pdf djvu.

kop-librusec-dedead.pl -dow -del C:\zi -f fb2 -fb2a rusec -fb2v 1.0 1.0

Сгрузить новые SQL-таблицы в текущий директорий,
прочитать зип-архивы из директория C:\zi
и вывести файлы результата в текущий директорий.
Результат будет содержать файлы: живые, в формате fb2, автора файла "rusec", версия файла 1.0.
ВНИМАНИЕ: все остальные файлы в файлах резуьтата будут уничтожены
(присутствует опция -del), а не заменнены на файлы размеров в один байт.

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

Спасибо большое. Оказывается папку для сохранения таки можно задавать параметром. О_о А перл дружить с русским и не надо - вполне достаточно скромного txt в архиве :) Попробую подкинуть еще идею. Что если научить скрипт перезаписывать архивы? Как я это вижу - скрипт создает в той же папке копию архива без дублей, затем исходник удаляется, а копия переименовывается в имя исходника. И так 123 раза :) Будет удобно для людей, которые хотят почистить архивы либрусека, но не имеют лишних 14 гигабайт.

Версия 0.3.4 - прикреплена к этому посту. Добавил опцию "removeoriginals" (Удаляет исходные зип-архивы Либрусека по мере обработки.). Подсказку на русском поместил внутрь файла, с возможностью вывода по опции "helprus", ну а если кракозябры - тогда смотреть внутри файла, подсказка на русском в самом начале файла.

Упдате: заменил версию 0.3.4 на версию 0.3.5 - добавлена заглушка на случай "dirzip == dirout и removeoriginals присутствует", дабы неосторожные не могли так легко отстрелить себе ногу.

Спасибо! Кажется скрипт наконец-то доведен до идеала :) Теперь можно по мере выхода новых архивов периодически чистить коллекцию.

И сразу же задам тупой вопрос. Что не так в параметрах ярлыка\командной строки?
C:\Perl\bin\perl5.8.0.exe C:\Perl\bin\kop-librusec-dedead.pl -sd C:\Perl\bin\libsql D:\Lib.rus.ec -rem -l ru

Пишет:
Can't locate Archive/Extract.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site
/lib .) at C:\Perl\bin\kop-librusec-dedead.pl line 187.
BEGIN failed--compilation aborted at C:\Perl\bin\kop-librusec-dedead.pl line 187
.

Причем пишет вне зависимости от параметров.

UPD. Отбой. Поставил последний перл и все заработало. Кстати прописывал ds а не sd как в примере.

Bullfear написал:
И сразу же задам тупой вопрос. Что не так в параметрах ярлыка\командной строки?
C:\Perl\bin\perl5.8.0.exe C:\Perl\bin\kop-librusec-dedead.pl -sd C:\Perl\bin\libsql D:\Lib.rus.ec -rem -l ru
Пишет:
Can't locate Archive/Extract.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site
/lib .) at C:\Perl\bin\kop-librusec-dedead.pl line 187.
BEGIN failed--compilation aborted at C:\Perl\bin\kop-librusec-dedead.pl line 187
.
Причем пишет вне зависимости от параметров.
UPD. Отбой. Поставил последний перл и все заработало. Кстати прописывал ds а не sd как в примере.

Ура. А я как раз хотел это и посоветовать. Путаница sd - ds - спасибо что отметил, как руки дойдут поисправляю опечатки.

Не заработало :( Сперва долго долго распаковывало таблицы, а потом стало создавать в папке с перлом кучу архивов по 158 байт с единичками и с именем bin в начале архива. Тоесть почему-то решило, что все файлы являются толи дублями, толи иностранцами. Кстати помоему вполне логично, что если скрипт встречает тег rem, то надо перезаписывать архивы в той же папке, где они находятся и с тем же названием, если явно не задано другое место.

Bullfear написал:
Кстати помоему вполне логично, что если скрипт встречает тег rem, то надо перезаписывать архивы в той же папке, где они находятся и с тем же названием, если явно не задано другое место.

У меня не получилось пока логику развести, чтобы в ту же папку, и при этом не дай бог не стереть исходный зип невовремя. Но я думаю, это не шибко существенно.

Bullfear написал:
Не заработало :(

Он там в начале должен выводить что-то наподобие такого, скопипейсти это сюда плз, без этого трудно разобраться будет:

Drive="U" Program name: "U:\perlscripts\kop-librusec-dedead.pl" Run date: 19:29:11 3/4/2009
Job parameters:
[     1 of     18] deletemembers   |S| "0"
[     2 of     18] dircur          |S| "C:"
[     3 of     18] dirout          |S| "C:"
[     4 of     18] dirsql          |S| "C:"
[     5 of     18] dirzip          |S| "F:\5525-compare-2008-12-22"
[     6 of     18] download        |S| "0"
[     7 of     18] fb2authors      |A| empty
[     8 of     18] fb2versions     |-| undef
[     9 of     18] formats         |A| empty
[    10 of     18] keepmistyped    |S| "0"
[    11 of     18] languages       |A| empty
[    12 of     18] libbook         |S| "C:\lib.libbook.sql"
[    13 of     18] libbook_old     |S| "C:\lib.libbook.old.sql"
[    14 of     18] libfilename     |S| "C:\lib.libfilename.sql"
[    15 of     18] removeoriginals |S| "0"
[    16 of     18] url_libbook     |S| "http://lib.rus.ec/sql/lib.libbook.sql.gz"
[    17 of     18] url_libbook_old |S| "http://lib.rus.ec/sql/lib.libbook.old.sql.gz"
[    18 of     18] url_libfilename |S| "http://lib.rus.ec/sql/lib.libfilename.sql.gz"
Loading 3 librusec SQL tables into hashes...

Скопировать при работающем скрипте не получилось, поэтому выкладываю скриншот.

Параметры ярлыка:
C:\Perl\bin\perl5.10.0.exe C:\Perl\bin\kop-librusec-dedead.pl -ds C:\Perl\bin\libsql D:\Lib.rus.ec -rem -l ru

Цитата:

У меня не получилось пока логику развести, чтобы в ту же папку, и при этом не дай бог не стереть исходный зип невовремя. Но я думаю, это не шибко существенно.

Существенно. Представь - лежат архивы в папке. В myhomelib все настроено, и т.д. На винте свободна пара гигабайт. Сделал один раз ярлык и при обновлении архивов либрусека его запускаешь - он чистит лишние дубли, иностранцев и т.п., так как в старых архивах некоторое число файлов постоянно заменяется свежими версиями. После работы скрипта никуда не надо лезть, ничего не надо переименовывать(если получится подружить -dow с фаерволом ;).
А по поводу логики два варианта:
- копировать с тем же именем в папку tmp(при этом надо естественно создавать эту папку), удалять оригинал, а после завершения обработки оттуда перемещать.
- более красивый. копировать файл с другим именем в ту же папку, а после его обработки удалять старый и переименовывать новый.

Страницы

X