|
Nokia Internet Tablet N8XX http://n8xx.com/index.html Проблема с именем файлов в FBReader http://n8xx.com/message-1437.html |
| alex2ndr @ 19-06-2008 12:13:06 |
Всем доброго времени суток |
| Zhiz0id @ 19-06-2008 12:28:58 |
Мне видятся два варианта решения проблемы: |
| alex2ndr @ 19-06-2008 12:38:19 |
Вариант А конечно хорош - только сдается мне автор FBReader не в силах исправить это - но попробую ему написать. Вариант Б мне нравиться тем что все зависит только от меня а не от кого то еще и никого не нужно ждать - попробую куда-нить выложить несколько каталогов с книгами - потом ссылку оставлю. |
| dik @ 19-06-2008 12:44:33 |
-------------------------------------- |
| dik @ 19-06-2008 12:52:08 |
find -iname "*.txt" -exec zip {}.zip {} \; упакует все файлы txt в архивы. |
| mrkooll @ 19-06-2008 13:26:10 |
А в zip имена в cp1251? ИМХО там cp866. |
| alex2ndr @ 20-06-2008 10:39:46 |
я так понимаю что в текущей директории распакует - но у меня архивы с книгами раскиданы по директориям по имени авторов а подом по подпапкам с названием серии - т е получается до второй вложенности включительно, причем имена авторов и названия серий даны по русски и с пробелами. Выглядит примерно так(привел тока часть списка ибо он великоват) Код:alex@hc-deb-al:~/documents/Книги$ du -a ./ 428 ./Симмонс Дэн/Simmons_Giperion.zip 456 ./Симмонс Дэн/Simmons_Padenie_Giperiona.zip 888 ./Симмонс Дэн 360 ./Браславский Дмитрий/braslavskii_pautina_laigasha.zip 364 ./Браславский Дмитрий 368 ./Иванова Вероника/Ivanova -2.zip 376 ./Иванова Вероника/Ivanova_Veronika_Pravo_uchit(I_majatnik_kachnulsja-4)[1].fb2.zip 432 ./Иванова Вероника/Ivanova -1.zip 368 ./Иванова Вероника/Ivanova -3.zip 1548 ./Иванова Вероника 156 ./Де Ченси Джон/Замок3.zip 152 ./Де Ченси Джон/Замок2.zip 156 ./Де Ченси Джон/Замок1.zip 468 ./Де Ченси Джон 436 ./Малицкий Сергей/Malitzkij_Missija_dlja_chuzhezemtza(Arban_Saesh-1).fb2.zip 468 ./Малицкий Сергей/Malitzkij_Kameshek_v_zhernovah(Arban_Saesh-3).fb2.zip 492 ./Малицкий Сергей/Malitzkij_Otschet_tenej(Arban_Saesh-2).fb2.zip 1400 ./Малицкий Сергей 320 ./Уланов Андрей/ulanov_andrei_kolduny_i_kapusta.rtf.zip 4 ./Уланов Андрей/descript.ion 292 ./Уланов Андрей/ulanov_andrei_kolduny_i_kapusta.zip 316 ./Уланов Андрей/ulanov_andrei_na_vseh_hvatit.fb2.zip 272 ./Уланов Андрей/Ulanov_Princessa_dlja_serzhanta.zip 316 ./Уланов Андрей/Ulanov_Dodge_po_imeni_Arizona.zip 1524 ./Уланов Андрей 424 ./Королев Павел/Kornev_Skolzkij(Prigranichje-2).fb2.zip 360 ./Королев Павел/Kornev_Led.zip 788 ./Королев Павел 252 ./Мусаниф Сергей/Musanif_Imperskie_voiny.fb2.zip 256 ./Мусаниф Сергей/Musanif_Imperskii_gambit.fb2.zip 240 ./Мусаниф Сергей/Musanif_Imperskie_tancy.fb2.zip 752 ./Мусаниф Сергей 344 ./Ip-tables.zip 320 ./Зорич Александр/Пути Звезднорожденных/Пути Звезднорожденных-1.zip 328 ./Зорич Александр/Пути Звезднорожденных/Пути Звезднорожденных-3.zip 320 ./Зорич Александр/Пути Звезднорожденных/Пути Звезднорожденных-2.zip 972 ./Зорич Александр/Пути Звезднорожденных Как видите в именах архивов есть и пробелы и различные символы. Код:alex@hc-deb-al:~/Desktop/Гудкайнд Терри$ find -iname "*.zip" -exec unzip {} \;
Archive: ./Шестое правило волшебника.zip
inflating: ��ԫ� ��� |
| alex2ndr @ 20-06-2008 10:42:40 |
такс - обнаружил ограничение на размер сообщения - продолжаю |
| alex2ndr @ 20-06-2008 10:48:58 |
Нет - это не ограничение на размер сообщения - это форум не хочет воспроизводить те самые иероглифы в которые превратились имена файлов |
| Wall @ 20-06-2008 12:50:12 |
Вот вам заготовочка для начала: Код:find ./ | while read fname; do echo "$fname -> `echo $fname | iconv -fkoi8-r -tutf8`" ; done Вы хотите перекодировать содержимое или имена файлов тоже? А имена каталогов? |
| Wall @ 20-06-2008 13:29:00 |
Вот скрипт, который перекодирует имена файлов и каталогов. Считается, что исходная структура в ./in, а результат он кладет в ./out. Код:#!/bin/sh
find ./in/ -type f | while read fn; do
newfn=`echo $fn | iconv -fkoi8-r -tutf8 | sed 's/^\.\/in/\.\/out/'`
dirname=`dirname "$newfn"`
[ -d "$dirname" ] || mkdir -p "$dirname"
cp "$fn" "$newfn"
done |
| alex2ndr @ 21-06-2008 04:01:15 |
Попробовал с различными кодировками (iconv - l выдал огромный список - чтобы весь попробовать надо еще один скрипт писать - проверил самые вероятные - koi8-r, CP1251, CP866, WINDOWS-1251) - имена папок и архивов превратились в крякозяблики - содержимое архивов осталось прежним. Если это содержимое распаковать то при конвертации одни кракозяблики на другие меняються. |
| Wall @ 21-06-2008 05:51:33 |
Если вам только архивы распаковать, переименовать файлы в utf8 и запаковать обратно, то скрипт будет ненамного сложнее. |
| alex2ndr @ 21-06-2008 06:34:38 |
закинул в чем то более переносимом :) - http://ifolder.ru/7060446 Код:7z x primer.7z |
| alex2ndr @ 21-06-2008 10:36:35 |
У Вас возможно и ненамного - а у меня получилось вот так - Код:#!/bin/sh
#
# Script for convert file's names
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Ищем файлы в каталоге ./in/
find ./in/ -type f | while read file_name; do
# повторяем структуру каталогов в ./out/
dir_name=`dirname "$file_name"`
new_dir_name=`dirname "$file_name" | sed 's/^\.\/in/\.\/out/'`
[ -d "$new_dir_name" ] || mkdir -p "$new_dir_name"
# запоминаем чистое имя файла - а заодно заменим пробелы на _
new_file_name=`echo "${file_name##"$dir_name/"}" | sed 's/ /_/g'`
# а эта переменная содержит имя файла которое ему нужно присвоить после распаковки - см ниже
new_file_name_txt=`echo "${file_name##"$dir_name/"}" | sed 's/ /_/g' | sed 's/\.zip/\.txt/'`
# Копируем файлы из ./in/ в ./out/
cp "$file_name" "$new_dir_name"
# Ищем только файлы содержащие русские буквы
if [ -n "`find "$new_dir_name" -maxdepth 1 -type f -iname "*[а-я]*"`" ]
then
# Так как я не смог договориться с unzip то ищу файлы содержащие пробелы
temp_file_name_0=`find "$new_dir_name" -maxdepth 1 -type f -iname "* *"`
if [ -n "$temp_file_name_0" ]
then
# А затем заменяю в них пробелы на _
temp_file_name_1="$new_dir_name/$new_file_name"
mv "$temp_file_name_0" "$temp_file_name_1"
# Затем я их распаковываю - вот тут у меня основная проблема - я не знаю как
# их сразу после этого переименовать в $new_file_name_txt - подскажите кто знает
unzip "$temp_file_name_1" -d "$new_dir_name"
# а потом удалаю первоначальные архивы
rm "$temp_file_name_1"
else
# Здесь тоже самое только для файлов без пробелов
temp_file_name_2=`find "$new_dir_name" -maxdepth 1 -type f -name "$new_file_name"`
unzip "$temp_file_name_2" -d "$new_dir_name"
rm "$temp_file_name_2"
fi
fi
done
exit 0прошу сразу ногами не пинать - скриптер из меня неважный как я уже говорил. Основная проблема описана в коментариях - повторю просто - не знаю как переименовать файл со стандартного ввода (или еще как - я его потом не могу в каталоге найти так как у него имя кракозябликами ), в Вашем скрипте используется iconv что не совсем то что я хочу (точнее не получается у меня им воспользоваться, да и хочу я транслитерацию - но как это сделать не знаю тем более) |
| dik @ 21-06-2008 11:56:08 |
dik@storm:~/$ ls | enca Код:unzip "$temp_file_name_1" -d "$new_dir_name" txtname = `cd "$new_dir_name"; ls -t *.txt | sed -n '1p' zipname = `echo "$temp_file_name_1" | sed 's/.zip/.txt/'` mv "$txtname" "$zipname" |
| Wall @ 21-06-2008 12:13:54 |
Как-то все у вас сложно :) |
| alex2ndr @ 21-06-2008 12:22:17 |
в подавляющем большинстве случаев по одному - книги то я по одной читал
В больщинстве да - но я думаю найдется некоторое количество с расширением fb2 |
| Wall @ 21-06-2008 12:28:56 |
Вот короткий вариант того, что делает ваш скрипт, за исключением замены пробелов на подчеркивания. Код:cp -r in out find ./out/ -type f -iname "*[а-я]*.zip" | while read fn ; do unzip -p "$fn" > "`echo $fn | sed 's/\.zip$/.txt/'`" ;done |
| alex2ndr @ 21-06-2008 12:51:14 |
я так уже пробовал - он потом файл с таким название не может найти и ругается - как я понял мона тока через конвеер(мне так кажется) -вот такая ошибка выдается для каждого из файлов - Код:mv: невозможно выполнить stat для `\304ի\324\341 \241\341 \253ի\324\241\277\254\3412.txt': No such file or directory
спасибо конечно - только я не смог добиться от него такой же функциональности(копируется нормально - но вот что там с распаковкой неизвестно - архивы остались архивами) - а отлаживать такое я не умею (в моем когда не получается я через echo вывожу значения переменных и смотрю какие они) - и насчет размера все верно - мой как раз на присвоение\описание всех этих переменных больше |
| Wall @ 21-06-2008 12:58:31 |
Вы где его запускаете? У моего unzip-а есть ключ -p - распаковывать на stdout. Я им и попользовался. А архивы я оставляю нетронутыми, я только рядом распакованый файл кладу с именем архива и расширением .txt. |
| alex2ndr @ 21-06-2008 13:04:46 |
а там надо два каталога создать - ./in и ./out (Ваша идея кстати) - я не стал писать проверку на их наличие - как то не подумал что у других их может не быть. |
| Wall @ 21-06-2008 13:09:06 |
Вот вам 'развернутый вариант', но он короче не на присвоение и описание переменных - у него логика в три строчки :) Код:cp -r in out
find ./out/ -type f -iname '*[а-я]*.zip' | while read fn ; do
newfn="`echo $fn | sed -e 's/\.zip$/.txt/'`"
unzip -p "$fn" > "$newfn"
doneТеперь понятно? Код:$ rm -rf out $ find ./in/ ./in/ ./in/Авраменко Олег ./in/Авраменко Олег/Avramenko_Vse_grani_mira.zip ./in/Авраменко Олег/Avramenko_Grani_nizhnego_mira.zip ./in/Дашков Андрей ./in/Дашков Андрей/ВОЙНЫ НЕКРОМАНТОВ.zip ./in/Злотников Роман ./in/Злотников Роман/Вечный ./in/Злотников Роман/Вечный/Вечный2.zip ./in/Злотников Роман/Вечный/Вечный3.zip ./in/Злотников Роман/Вечный/Вечный1.zip ./in/Злотников Роман/Вечный/Вечный4.zip ./in/Злотников Роман/Арвендэйл ./in/Злотников Роман/Арвендэйл/Arvendejl1.zip ./in/Злотников Роман/Арвендэйл/Arvendejl2.zip ./in/Злотников Роман/Охота на охотника ./in/Злотников Роман/Охота на охотника/Охота на охотника2.zip ./in/Злотников Роман/Охота на охотника/Охота на охотника1.zip ./in/Ахманов Михаил ./in/Ахманов Михаил/Ahmanov_Skifi_pirujut_na_zakate-1.zip ./in/Ахманов Михаил/Ahmanov_Strannik_prishedshii_izdaleka-2.zip ./in/Ахманов Михаил/ДИК САЙМОН – 1.zip $ sh ../recode2 $ find ./out/ ./out/ ./out/Авраменко Олег ./out/Авраменко Олег/Avramenko_Vse_grani_mira.zip ./out/Авраменко Олег/Avramenko_Grani_nizhnego_mira.zip ./out/Дашков Андрей ./out/Дашков Андрей/ВОЙНЫ НЕКРОМАНТОВ.zip ./out/Дашков Андрей/ВОЙНЫ НЕКРОМАНТОВ.txt ./out/Злотников Роман ./out/Злотников Роман/Вечный ./out/Злотников Роман/Вечный/Вечный2.zip ./out/Злотников Роман/Вечный/Вечный4.txt ./out/Злотников Роман/Вечный/Вечный2.txt ./out/Злотников Роман/Вечный/Вечный3.txt ./out/Злотников Роман/Вечный/Вечный3.zip ./out/Злотников Роман/Вечный/Вечный1.zip ./out/Злотников Роман/Вечный/Вечный1.txt ./out/Злотников Роман/Вечный/Вечный4.zip ./out/Злотников Роман/Арвендэйл ./out/Злотников Роман/Арвендэйл/Arvendejl1.zip ./out/Злотников Роман/Арвендэйл/Arvendejl2.zip ./out/Злотников Роман/Охота на охотника ./out/Злотников Роман/Охота на охотника/Охота на охотника2.zip ./out/Злотников Роман/Охота на охотника/Охота на охотника1.txt ./out/Злотников Роман/Охота на охотника/Охота на охотника1.zip ./out/Злотников Роман/Охота на охотника/Охота на охотника2.txt ./out/Ахманов Михаил ./out/Ахманов Михаил/Ahmanov_Skifi_pirujut_na_zakate-1.zip ./out/Ахманов Михаил/Ahmanov_Strannik_prishedshii_izdaleka-2.zip ./out/Ахманов Михаил/ДИК САЙМОН – 1.txt ./out/Ахманов Михаил/ДИК САЙМОН – 1.zip |
| alex2ndr @ 21-06-2008 13:19:36 |
2Wall Код:unzip "$temp_file_name_1" -d "$new_dir_name" на Код:unzip -p "$temp_file_name_1" > "$new_dir_name/$new_file_name_txt" и получил то что надо - имена файлов нормально отобразились - только плиз скажите как теперь это запаковать все в zip - понимаю что осталось приписать что нить туда в конвеер - только вот что разбираться сил не осталось (весь день сегодня это кодю и читаю Advanced Bash-Scripting Guide - я ж в скриптах совсем новичок) |
| Wall @ 21-06-2008 13:23:19 |
А это что не проверка? Код:[ -d "$new_dir_name" ] || mkdir -p "$new_dir_name"
Тогда смотрите развернутый вариант моего скрипта и говорите что не работает. |
| Wall @ 21-06-2008 13:25:23 |
Разобрались? Ну и отлично. Сейчас покажу как запаковать. |
| alex2ndr @ 21-06-2008 13:34:08 |
мне кажется у Вас такая же проблема с -iname "*[а-я]*" - если закоментить эту часть он так и работает |
| alex2ndr @ 21-06-2008 13:42:53 |
разобрался до конца с вашим скриптом - надо было ручками переписать эту часть - iname "*[а-я]*.zip" - теперь работает так же как у Вас. Это называется не копипастите с сайтов :) |
| Wall @ 21-06-2008 13:49:20 |
Вот с запаковкой вариант: |
| Wall @ 21-06-2008 14:00:22 |
Вот немного получше: Код:cp -r in out
find ./out/ -type f -iname '*[а-я]*.zip' | while read fn ; do
newfn="`echo $fn | sed -e 's/\.zip$/.txt/'`"
unzip -p "$fn" > "$newfn"
zip - "$newfn" > "$fn"
rm "$newfn"
doneОсталась одна небольшая проблема - он пишет путь в архив. Если вас это смущает, то можно и это убрать. |
| alex2ndr @ 21-06-2008 14:01:21 |
хмы - направление конечно верное - тока есть одна сложность- он этот новый файл добавляет архив вместе с новым файлом - а заобно и путь туда загоняет |
| Wall @ 21-06-2008 14:08:19 |
Последний вариант не должен. Видимо мы с вами одновременно постили и вы его не видели. |
| alex2ndr @ 21-06-2008 14:10:10 |
интересно получается - если в корень добавить пару нужных для конвертации файликов (например скопировать из какого нить каталога) - то ваш скрипт как то странно на них отрабатывает - но с файлами что идут в каталогах с именами авторов работает вполне нормально |
| Wall @ 21-06-2008 14:21:10 |
С убиранием пути: Код:cp -r in out
find ./out/ -type f -iname '*[а-я]*.zip' | while read fn ; do
newfn="`echo $fn | sed -e 's/\.zip$/.txt/'`"
unzip -p "$fn" > "$newfn"
cdir=`pwd`
cd "$(dirname "$fn")"
zip - "$(basename "$newfn")" > "$(basename "$fn")"
cd "$cdir"
rm "$newfn"
doneОстальное не понял. С чего ему работать с файлами из корня, когда он обрабатывает только zip файлы с русскими именами из in? |
| Wall @ 22-06-2008 01:13:20 |
Вот покороче и без выкрутасов. Почитал man по zip :) Код:cp -r in out
find ./out/ -type f -iname '*[а-я]*.zip' | while read fn ; do
newfn="`echo $fn | sed -e 's/\.zip$/.txt/'`"
unzip -p "$fn" > "$newfn"
zip -mj - "$newfn" > "$fn"
doneКстати, после отладки можно будет убрать out и перепаковывать прям по месту, в in. Для этого нужно будет убрать копирование и заменить ./oút на ./in в строке find. А еще лучше сделать имя обрабатываемого каталога параметром, по умолчанию - текущий каталог. |
| alex2ndr @ 22-06-2008 02:24:02 |
2Wall Код:#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
cp -r in/* out
find ./out/ -type f -iname "*[а-я]*.zip" | while read fn ; do
tmpname=`basename "$fn" | sed -e 's/\.zip//'`
# Утилита uniconv находиться в пакете yudit
transname=`echo $tmpname | sed -e 's/–/_/g;s/ /_/g;s/-/_/g' | uniconv -encode Russian-Translit | sed -e 's/://g;s/"//g'`
# Выведем новое имя для визуальной проверки
echo "$tmpname = $transname" >> ./log_name.txt
fullnm="`dirname "$fn"`/$transname.txt"
unzip -p "$fn" > "$fullnm"
cdir=`pwd`
cd "$(dirname "$fn")"
zip - "$transname.txt" > "$transname.zip"
cd "$cdir"
rm "$fullnm"
rm "$fn"
done
exit 0насчет параметра считаю заморачиваться не стоит - скрипт нужен по сути один раз - насчет in и out - тоже самое - только из любви к искусству :) |
| Wall @ 22-06-2008 02:29:39 |
Я бы убрал выкрутасы с cd. zip -mj гораздо приятнее, короче и безопаснее. |
| alex2ndr @ 22-06-2008 02:45:49 |
Ради тренировки доделал скрипт. Окончательная версия(если еще оптимизаторы не набегут :) ): Код:#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
cp -r in/* out
find ./out/ -type f -iname "*[а-я]*.zip" | while read fn ; do
tmpname=`basename "$fn" | sed -e 's/\.zip//'`
# Утилита uniconv находиться в пакете yudit - для работы этого скрипта данный пакет должен стоять
transname=`echo $tmpname | sed -e 's/–/_/g;s/ /_/g;s/-/_/g' | uniconv -encode Russian-Translit | sed -e 's/://g;s/"//g'`
fullnm="`dirname "$fn"`/$transname.txt"
unzip -p "$fn" > "$fullnm"
zip -mj - "$fullnm" > "`echo $fullnm | sed -e 's/\.txt/\.zip/'`"
rm "$fn"
done
exit 0 |
| Wall @ 22-06-2008 02:47:52 |
Красота :) А PATH зачем устанавливать? |
| alex2ndr @ 22-06-2008 02:51:30 |
да были у меня один раз грабли с тем что команды не хотели находиться - перенес скрипт на другую машину а там PATH другой - с тех пор я его всегда добавляю - на всякий случай :) |
| Wall @ 22-06-2008 03:01:22 |
Хотите оптимизаций :) не проблема! |
| alex2ndr @ 22-06-2008 04:00:26 |
вместо [ -–] надо писать [ -\–] иначе ругается так - Код:sed: -e выражение #1, символ 14: Invalid collation character Переменную transname убирать не стал ибо не люблю работать с выражениями которые на экране в 2 строки отражаються , а все остальное оптимизировал: Код:#!/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
cp -r in/* out
find ./out/ -type f -iname "*[а-я]*.zip" | while read fn ; do
# Утилита uniconv находиться в пакете yudit - для работы этого скрипта данный пакет должен стоять
transname=`basename "$fn" | sed -e 's/\.zip$//;s/[ -\–]/_/g' | uniconv -encode Russian-Translit | sed -e 's/[:"]//g'`
fullnm="`dirname "$fn"`/$transname.txt"
unzip -p "$fn" > "$fullnm"
zip -mj - "$fullnm" > "`echo $fullnm | sed -e 's/\.txt$/\.zip/'`"
rm "$fn"
done
exit 0Еще предложения будут?:) |
| Dali @ 23-06-2008 01:10:29 |
Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения. |
| alex2ndr @ 23-06-2008 02:01:55 |
Ясность кода у меня была на предыдущей странице - поищите там самый большой скрипт:) - я на нем отлаживал алгоритм. А мое мнение такое - на этапе отладки пусть она хоть как-нибудь работает - но окончательный продукт должен быть полностью оптимизирован и минимизирован, а нормальная ясность кода обеспечивается коментариями. Данная программа слишком маленькая - я посчитал что излишне набивать коментариями каждую строку:) |
| Wall @ 23-06-2008 03:53:21 |
Навскидку приходит в голову то, что обработка ошибок отсутствует, да и это предположение насчет in и out тоже не добавляет красоты.
Давайте. Только наверное лучше не в эту тему. |
| Wall @ 23-06-2008 03:56:59 |
Это все вопрос стиля. Мои советы были в соответствии с моими стилевыми предпочтениями. |
| Wall @ 23-06-2008 04:00:53 |
Вы себе льстите :) По крайней мере я так и не понял ваших манипуляций. |
| alex2ndr @ 23-06-2008 04:27:45 |
Спасибо:). Создал новую тему в Общие вопросы по Линукс - |
| alex2ndr @ 23-06-2008 04:33:48 |
Зато мне было понятно :) - разве это не главное что понимать должен разработчик - по крайней мере на этапе разработки. |
| Wall @ 23-06-2008 06:04:27 |
И что сказали люди? Неужели они сказали что ваш скрипт с этими temp_file_name_0 и temp_file_name_1 более понятен чем последний? |
| alex2ndr @ 23-06-2008 10:13:37 |
2Wall - Вы наверно неправильно меня поняли - я имел в виду что скрипты и первый и последний лежат на этом форуме и кто-то (кроме нас конечно) их уже видел, т. е. они "показаны людям"(ну не умею я лаконично выражаться).Но что они сказали осталось загадкой - так как по этому поводу никто кроме Dali ничего не запостил :) |