alex2ndr @ 19-06-2008 12:13:06

Всем доброго времени суток

Обнаружилась у меня интересная проблемка с моей книжной коллекцией. Я собираю ее постепенно (по мере прочтения) уже порядка 5 лет. Набралось пока гдето около 900-1000 книг от сотни авторов. Начал собирать еще для моего первого КПК на PocketPC (теперь это называется win mobile). Так как тогда флэшки стоили дороже то место я сурьезно экономил - все скачанные книги переводил в txt (обычно потому что doc читалки не поддерживали а про fb2 я еще не знал - да и в библиотеках его было мало выложено - а переводить в него часто криво получается) а потом сжимал в zip. Часто имя файла а потом и архива было названо по русски по имени произведения и к томуже с пробелами. И haalireader нормально все это читал. Теперь вместе с покупкой NokiaN800 соответственно перешел на FBreader (а незадолго перед этим с форточек на Debian) - и вот тут то и обнаружилась засада - читалка видит архив, названный по русски, нормально - но внутри него не видит файла (тож названного по русски) - хотя файл там точно есть - стал разбираться и поставил на свой домашний Debian нормальный FBReader(в смысле версию для i386 архитектуры). Обнаружилось кое что орригинальное - при распаковке файла в debian имя файла отображается какими то квадратиками, причем название архива выглядит нормально. И вот такой файл с именем квадратиками fbreader то и не видит - если файл уже в дебиане переназвать так же - то все нормально - как я понял это какая то проблема с кодировками между виндой и линухом - т. е. с cp1251 и utf8. Соответственно сама просьба - мне в принципе все равно как будут названы файлы - по русски там или транслитом - вот поэтому хочу написать скрипт который будет распаковывать архивы названные по русски переобразовывать имена в транслит и паковать назад(ручками переименовывать 500 файлов это как то муторно) - но прошу помощи в том как написать команду отбора этих файлов/архивов - я не очень силен в скриптах.

Может кто нить предложит какое нить еще решение - менее геморное - буду очень благодарен.

Всем спасибо

PS Уважаемые модераторы - возможно я создал тему не в том разделе (проблема многогранна и относиться не совсем к таблетке - просто впервые столкнулся именно на ней). Поэтому если Вам так покажется - перенесите ее пожалуйста в  более подходящее место.

Zhiz0id @ 19-06-2008 12:28:58

Мне видятся два варианта решения проблемы:
а) Обратиться к автору с вопросом(он сам русскоговорящий на сколько помню). Ему пофиксить эту проблему не сложно.
б) Написать скрипт. Сам скрипт написать не сложно, но нужно иметь несколько файлов для теста.


Вариант "а" предпочтительней :)

alex2ndr @ 19-06-2008 12:38:19

Вариант А конечно хорош - только сдается мне автор FBReader не в силах исправить это - но попробую ему написать. Вариант Б мне нравиться тем что все зависит только от меня а не от кого то еще и никого не нужно ждать - попробую куда-нить выложить несколько каталогов с книгами - потом ссылку оставлю.

dik @ 19-06-2008 12:44:33

--------------------------------------


find -iname "*.zip" -exec unzip {} \;
распакует все архивы в директории
------------------------------------------

$convmv -r --notest --nosmart -f cp1251 -t utf-8 filename
для перекодировки имени
попробуйте так на одном файлике - если всё ок /
$convmv -r --notest --nosmart -f cp1251 -t utf-8 *
в директории с файлами

dik @ 19-06-2008 12:52:08

find -iname "*.txt" -exec zip {}.zip {} \;  упакует все файлы txt в архивы.

кто то может написал бы скрипт проще и красивше - но - можете попробовать так :

в той директории где лежат zip файлы - распаковываете все
затем перемещаете в сторону / удаляете .zip файлы   $mv *.zip /home/user/book/

проводите перекодировку всех txt в директории
упаковываете все txt в zip

всё

Не знаю - есть ли у вас в именах пробелы и другие символы с которыми теоритически могут быть проблемы.

mrkooll @ 19-06-2008 13:26:10

А в zip имена в cp1251? ИМХО там cp866.

alex2ndr @ 20-06-2008 10:39:46

find -iname "*.zip" -exec unzip {} \;
распакует все архивы в директории

я так понимаю что в текущей директории распакует - но у меня архивы с книгами раскиданы по директориям по имени авторов а подом по подпапкам с названием серии - т е получается до второй вложенности включительно, причем имена авторов и названия серий даны по русски и с пробелами. Выглядит примерно так(привел тока часть списка ибо он великоват)

Код:

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

такс - обнаружил ограничение на размер сообщения - продолжаю
Но это конечно фигня - мона и в цикл загнать по всем каталогам - тока эта команда дает странный результат

[code]alex@hc-deb-al:~/Desktop/Гудкайнд Терри$ find -iname "*.zip" -exec unzip {} \;
Archive:  ./Шестое правило волшебника.zip
  inflating: ��ԫ� ���

alex2ndr @ 20-06-2008 10:48:58

Нет - это не ограничение на размер сообщения - это форум не хочет воспроизводить те самые иероглифы в которые превратились имена файлов

Тогда раскажу на словах - при распаковке имена файлов из архива преобретают вид иероглифов(ромю\биков со знаками вопроса) - и не исправляються при последующем конвертировании, пробовал как cp1251 так и cp866 - результат одинаково нечитаем.

Ну до упаковки понятно я не дошел
Мне кажется что всетаки придется переводить в транслит - причем при распаковке сначала брать имя архива - потому что получившееся имя файла нечитаемо и непереводимо наверно - только хочется сохранить названия каталогов по русски

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

Всем спасибо за ответы

Wall @ 20-06-2008 12:50:12

Вот вам заготовочка для начала:

Код:

find ./ | while read fname;  do echo "$fname -> `echo $fname | iconv -fkoi8-r -tutf8`"  ; done

Вы хотите перекодировать содержимое или имена файлов тоже? А имена каталогов?

PS: Только кодировки поменяйте в вызове iconv на нужные.

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

Wall говорит:

Вот скрипт, который перекодирует имена файлов и каталогов. Считается, что исходная структура в ./in, а результат он кладет в ./out.
Пробуйте. Если оно у вас заработает, то можно будет приступить к перепаковке архивов.

Попробовал с различными кодировками (iconv - l выдал огромный список - чтобы весь попробовать надо еще один скрипт писать - проверил самые вероятные - koi8-r, CP1251,  CP866, WINDOWS-1251) - имена папок и архивов превратились в крякозяблики - содержимое архивов осталось прежним. Если это содержимое распаковать то при конвертации одни кракозяблики на другие меняються.

Имена каталогов хочу оставить на русском - переконвертировать (или написать в транслите) надо только имена файлов

Спасибо за участие - но боюсь данное решение не совсем верное - мне кажется что имя архива было конвертировано еще при переносе на таблетку - ведь в fstab стоит опция utf8 (как я понимаю это эквивалент того что стоит в моем fstab - nls=utf8), т. е. имена архивов уже в utf8 - но вот содержимое архивов попрежнему в непонятном формате (оно же не конвертировалось при переносе)- я сталкивался с таким когда переносил архивы созданные в linux по самбе на винду (монтировал виндовую папку в линух с опцией iocharset=koi8-r) - имя архива нормальное - а содержимое кракозябликами. Если мое предположение неверно - поправьте меня.

Залил несколько папок на Ifolder - http://ifolder.ru/7058757    желающие могут посмотреть - всего файлов которых нужно поправить там 8, и 6 таких, которых править не надо - постарался как можно более полно представить различные случаи для тестирования скрипта - я всетаки надеюсь написать скрипт который будет работать только с неправильными файлами :) .

Всем еще раз спасибо

Wall @ 21-06-2008 05:51:33

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

alex2ndr @ 21-06-2008 06:34:38

закинул в чем то более переносимом :) - http://ifolder.ru/7060446   

а предыдущий архив был в 7z - у меня берет так -

Код:

7z x primer.7z
alex2ndr @ 21-06-2008 10:36:35

Wall говорит:

Если вам только архивы распаковать, переименовать файлы в utf8 и запаковать обратно, то скрипт будет ненамного сложнее.

У Вас возможно и ненамного - а у меня получилось вот так -

Код:

#!/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 что не совсем то что я хочу (точнее не получается у меня им воспользоваться, да и хочу я транслитерацию - но как это сделать не знаю тем более)

2 Wall
В любом случае спасибо за Ваш скрипт - он послужил мне основой

dik @ 21-06-2008 11:56:08

dik@storm:~/$ ls | enca
Universal transformation format 8 bits; UTF-8
  Doubly-encoded to UTF-8 from maccyr
dik@storm:~/$ unzip ДИК\ САЙМОН\ –\ 1.zip
Archive:  ДИК САЙМОН – 1.zip
  inflating: ����� - 1.txt     
dik@storm:~/$ ls *.txt | enca
Unrecognized encoding

Можно сделать проще - называть txt после извлечения из архива - именем архива.

Код:

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

Как-то все у вас сложно :)
Ответьте мне на 2 вопроса:
- В архивах у вас по одному файлу?
- расширение у файлов .txt ?
Если это так, то все можно сделать гораздо проще.

alex2ndr @ 21-06-2008 12:22:17

- В архивах у вас по одному файлу?

в подавляющем большинстве случаев по одному - книги то я по одной читал

- расширение у файлов .txt ?

В больщинстве да - но я думаю найдется некоторое количество с расширением 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

dik говорит:

Можно сделать проще - называть txt после извлечения из архива - именем архива.

я так уже пробовал - он потом файл с таким название не может найти и ругается - как я понял мона тока через конвеер(мне так кажется) -вот такая ошибка выдается для каждого из файлов -

Код:

mv: невозможно выполнить stat для `\304ի\324\341 \241\341 \253ի\324\241\277\254\3412.txt': No such file or directory

Wall говорит:

от короткий вариант того, что делает ваш скрипт, за исключением замены пробелов на подчеркивания.

спасибо конечно - только я не смог добиться от него такой же функциональности(копируется нормально - но вот что там с распаковкой неизвестно - архивы остались архивами) - а отлаживать такое я не умею (в моем когда не получается я через echo вывожу значения переменных и смотрю какие они) - и насчет размера все верно - мой как раз на присвоение\описание всех этих переменных больше

Wall @ 21-06-2008 12:58:31

Вы где его запускаете? У моего unzip-а есть ключ -p - распаковывать на stdout. Я им и попользовался. А архивы я оставляю нетронутыми, я только рядом распакованый файл кладу с именем архива и расширением .txt.

PS: Ваш скрипт у меня тоже не работает, кстати. Ругается так: "... Нет такого файла или каталога", "unzip:  cannot find or open ./out/..."rm: невозможно удалить ...".

alex2ndr @ 21-06-2008 13:04:46

а там надо два каталога создать -  ./in и ./out (Ваша идея кстати) - я не стал писать проверку на их наличие - как то не подумал что у других их может не быть.
А ключ -p и у моего unzip есть

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
Да - Вы правы - разобрался - работает такой скрипт вполне - у меня там была проблема с -iname '*[а-я]*.zip - русские символы в кракозяблики почему то обращались при записи файла - страно это - в остальных файлах такого не было. Но если эту часть выкинуть то ввсе вполне работает(хотя и англицкие тож распаковывает - ну да ладно)

Большое Вам спасибо за то что обратили внимание на uname -p - в моем скрипте я заменил строчку

Код:

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 - я ж в скриптах совсем новичок)

PS Оптимизацией завтра займусь - действительно можно выкинуть кучу всего

Wall @ 21-06-2008 13:23:19

alex2ndr говорит:

а там надо два каталога создать -  ./in и ./out (Ваша идея кстати) - я не стал писать проверку на их наличие - как то не подумал что у других их может не быть.

А это что не проверка? 

Код:

[ -d "$new_dir_name" ] || mkdir -p "$new_dir_name"

А ключ -p и у моего unzip есть

Тогда смотрите развернутый вариант моего скрипта и говорите что не работает.

PS: Не знаю что я делаю не так, но после создания out ваш скрипт не ругается, но ничего и не делает. Его результат - копия in в out.

Wall @ 21-06-2008 13:25:23

Разобрались? Ну и отлично. Сейчас покажу как запаковать.

alex2ndr @ 21-06-2008 13:34:08

PS: Не знаю что я делаю не так, но после создания out ваш скрипт не ругается, но ничего и не делает. Его результат - копия in в out.

мне кажется у Вас такая же проблема с -iname "*[а-я]*" - если закоментить эту часть он так и работает

alex2ndr @ 21-06-2008 13:42:53

разобрался до конца с вашим скриптом - надо было ручками переписать эту часть - iname "*[а-я]*.zip" - теперь работает так же как у Вас. Это называется не копипастите с сайтов :)

Wall @ 21-06-2008 13:49:20

Вот с запаковкой вариант:
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 -D "$fn" "$newfn"
        rm "$newfn"
done

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

интересно получается - если в корень добавить пару нужных для конвертации файликов (например скопировать из какого нить каталога) - то ваш скрипт как то странно на них отрабатывает - но с файлами что идут в каталогах с именами авторов работает вполне нормально

А путь конечно надо убрать - неудобно в FBreader щелкать этот путь дважды - тем более на таблетке

Да - последний вариант затирает старый файл

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 - тоже самое - только из любви к искусству :)

Задача нужная мне ВЫПОЛНЕНА - Всем спасибо за помощь и советы

PS Всем кому нужен этот скрипт(или подобная функциональность) - пользуйтесь :)

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 зачем устанавливать?

да были у меня один раз грабли с тем что команды не хотели находиться - перенес скрипт на другую машину а там PATH другой - с тех пор я его всегда добавляю - на всякий случай :)

Wall @ 22-06-2008 03:01:22

Хотите оптимизаций :) не проблема!
1. Ваше sed выражение sed -e 's/–/_/g;s/ /_/g;s/-/_/g' избыточно. Достаточно sed -e 's/[ -–]/_/g'
2. Переменная tmpname не нужна, она используется один раз.
3. Тоже самое с transname, правда выражение получится длинным, поэтому на любителя
4. sed -e 's/\.zip//' удаляет .zip не только в конце. Лучше sed -e 's/\.zip$//'
5. тоже самое здесь: sed -e 's/\.txt/\.zip/'

alex2ndr @ 22-06-2008 04:00:26

wall говорит:

1. Ваше sed выражение sed -e 's/–/_/g;s/ /_/g;s/-/_/g' избыточно. Достаточно sed -e 's/[ -–]/_/g'

вместо [ -–] надо писать [ -\–] иначе ругается так -

Код:

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

Еще предложения будут?:)

PS 2wall - есть у меня еще один свеженаписанный скриптик (как обычно кривокодерский :) ) - но к таблетке не относиться - посмотреть не желаете? ;)

Dali @ 23-06-2008 01:10:29

Wall говорит:

2. Переменная tmpname не нужна, она используется один раз.
3. Тоже самое с transname, правда выражение получится длинным, поэтому на любителя

Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.

alex2ndr @ 23-06-2008 02:01:55

Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.

Ясность кода у меня была на предыдущей странице - поищите там самый большой скрипт:) - я на нем отлаживал алгоритм. А мое мнение такое - на этапе отладки пусть она хоть как-нибудь работает - но окончательный продукт должен быть полностью оптимизирован и минимизирован, а нормальная ясность кода обеспечивается коментариями. Данная программа слишком маленькая - я посчитал что излишне набивать коментариями каждую строку:)

Оффтоп - обнаружил тут в вышеупомянутом скрипте (том, что кривокодерский но к таблетке не относиться - я чуть выше упоминал) бесконечный цикл :D, который гонял мой сервер 12 часов пока я это дело не заметил :P

Wall @ 23-06-2008 03:53:21

alex говорит:

Еще предложения будут?:)

Навскидку приходит в голову то, что обработка ошибок отсутствует, да и это предположение насчет in и out тоже не добавляет красоты.

PS 2wall - есть у меня еще один свеженаписанный скриптик (как обычно кривокодерский :) ) - но к таблетке не относиться - посмотреть не желаете? ;)

Давайте. Только наверное лучше не в эту тему.

Wall @ 23-06-2008 03:56:59

Dali говорит:

Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.

Это все вопрос стиля. Мои советы были в соответствии с моими стилевыми предпочтениями.
Однако определение переменной только для того, чтобы ее использовать  в следующей строке вряд ли может считаться хорошим стилем.
А насчет второго пункта я так и написал: на любителя и написал почему.

Wall @ 23-06-2008 04:00:53

alex2ndr говорит:

Ясность кода у меня была на предыдущей странице - поищите там самый большой скрипт:)

Вы себе льстите :) По крайней мере я так и не понял ваших манипуляций.

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

alex2ndr @ 23-06-2008 04:27:45

Wall говорит:

Давайте. Только наверное лучше не в эту тему.

Спасибо:). Создал новую тему в Общие вопросы по Линукс -
http://n8xx.com/subject-1454-skript-rez … rovat.html   
Всем кому интересно попрактиковаться в скриптах (и помочь мне :) ) - Добро пожаловать!

alex2ndr @ 23-06-2008 04:33:48

Wall говорит:

Вы себе льстите smile По крайней мере я так и не понял ваших манипуляций.

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

Wall @ 23-06-2008 06:04:27

И оба скрипта уже показаны людям.

И что сказали люди? Неужели они сказали что ваш скрипт с этими temp_file_name_0 и temp_file_name_1 более понятен чем последний?
А что непонятно в последнем-то? Куда уж проще, кажется.

alex2ndr @ 23-06-2008 10:13:37

И оба скрипта уже показаны людям.

2Wall - Вы наверно неправильно меня поняли - я имел в виду что скрипты и первый и последний лежат на этом форуме и кто-то (кроме нас конечно) их уже видел, т. е. они "показаны людям"(ну не умею я лаконично выражаться).Но что они сказали осталось загадкой - так как по этому поводу никто кроме  Dali ничего не запостил :)
А вообще я не питаю илюзий по поводу своего первого скрипта - поэтому и взял за основу для окончательного ваш последний - а когда говорил что писал понятный скрипт имел в виду что он будет понятен мне - типа как умел так и написал

Прошу модераторов простить меня за флуд

PS вообще наверно эту тему надо закрывать - задача то выполнена - но я не знаю как закрывать тему :(