PS: Не знаю что я делаю не так, но после создания out ваш скрипт не ругается, но ничего и не делает. Его результат - копия in в out.
мне кажется у Вас такая же проблема с -iname "*[а-я]*" - если закоментить эту часть он так и работает
Неактивен
разобрался до конца с вашим скриптом - надо было ручками переписать эту часть - iname "*[а-я]*.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 -D "$fn" "$newfn"
rm "$newfn"
done
Неактивен
Вот немного получше:
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Осталась одна небольшая проблема - он пишет путь в архив. Если вас это смущает, то можно и это убрать.
Неактивен
хмы - направление конечно верное - тока есть одна сложность- он этот новый файл добавляет архив вместе с новым файлом - а заобно и путь туда загоняет
Но все равно спасибо - завтра дорихтую
Неактивен
интересно получается - если в корень добавить пару нужных для конвертации файликов (например скопировать из какого нить каталога) - то ваш скрипт как то странно на них отрабатывает - но с файлами что идут в каталогах с именами авторов работает вполне нормально
А путь конечно надо убрать - неудобно в FBreader щелкать этот путь дважды - тем более на таблетке
Да - последний вариант затирает старый файл
Отредактированно alex2ndr (21-06-2008 14:14:12)
Неактивен
С убиранием пути:
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?
Неактивен
Вот покороче и без выкрутасов. Почитал 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. А еще лучше сделать имя обрабатываемого каталога параметром, по умолчанию - текущий каталог.
Неактивен
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 Всем кому нужен этот скрипт(или подобная функциональность) - пользуйтесь ![]()
Отредактированно alex2ndr (22-06-2008 02:25:54)
Неактивен
Ради тренировки доделал скрипт. Окончательная версия(если еще оптимизаторы не набегут
):
#!/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Неактивен
А PATH зачем устанавливать?
да были у меня один раз грабли с тем что команды не хотели находиться - перенес скрипт на другую машину а там PATH другой - с тех пор я его всегда добавляю - на всякий случай ![]()
Неактивен
Хотите оптимизаций
не проблема!
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/'
Неактивен
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 - есть у меня еще один свеженаписанный скриптик (как обычно кривокодерский
) - но к таблетке не относиться - посмотреть не желаете? ![]()
Неактивен
Wall говорит:
2. Переменная tmpname не нужна, она используется один раз.
3. Тоже самое с transname, правда выражение получится длинным, поэтому на любителя
Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.
Неактивен
Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.
Ясность кода у меня была на предыдущей странице - поищите там самый большой скрипт
- я на нем отлаживал алгоритм. А мое мнение такое - на этапе отладки пусть она хоть как-нибудь работает - но окончательный продукт должен быть полностью оптимизирован и минимизирован, а нормальная ясность кода обеспечивается коментариями. Данная программа слишком маленькая - я посчитал что излишне набивать коментариями каждую строку![]()
Оффтоп - обнаружил тут в вышеупомянутом скрипте (том, что кривокодерский но к таблетке не относиться - я чуть выше упоминал) бесконечный цикл
, который гонял мой сервер 12 часов пока я это дело не заметил ![]()
Отредактированно alex2ndr (23-06-2008 02:06:41)
Неактивен
alex говорит:
Еще предложения будут?
Навскидку приходит в голову то, что обработка ошибок отсутствует, да и это предположение насчет in и out тоже не добавляет красоты.
PS 2wall - есть у меня еще один свеженаписанный скриптик (как обычно кривокодерский
) - но к таблетке не относиться - посмотреть не желаете?
Давайте. Только наверное лучше не в эту тему.
Неактивен
Dali говорит:
Это вопрос стиля программирования. Гуры говорят, что ясность кода (часы, сэкономленные в поисках ошибок) важнее, чем сэкономленные несколько байт и микросекунд выполнения.
Это все вопрос стиля. Мои советы были в соответствии с моими стилевыми предпочтениями.
Однако определение переменной только для того, чтобы ее использовать в следующей строке вряд ли может считаться хорошим стилем.
А насчет второго пункта я так и написал: на любителя и написал почему.
Неактивен
alex2ndr говорит:
Ясность кода у меня была на предыдущей странице - поищите там самый большой скрипт
Вы себе льстите
По крайней мере я так и не понял ваших манипуляций.
Можете провести эксперимент - показать оба скрипта людям и спросить что они делают.
Я больше чем уверен, что быстрее можно понять логику последнего - она банально пряма.
Неактивен
Wall говорит:
Давайте. Только наверное лучше не в эту тему.
Спасибо
. Создал новую тему в Общие вопросы по Линукс -
http://n8xx.com/subject-1454-skript-rez … rovat.html 
Всем кому интересно попрактиковаться в скриптах (и помочь мне
) - Добро пожаловать!
Неактивен
Wall говорит:
Вы себе льстите smile По крайней мере я так и не понял ваших манипуляций.
Зато мне было понятно
- разве это не главное что понимать должен разработчик - по крайней мере на этапе разработки.
И оба скрипта уже показаны людям.
Неактивен
И оба скрипта уже показаны людям.
И что сказали люди? Неужели они сказали что ваш скрипт с этими temp_file_name_0 и temp_file_name_1 более понятен чем последний?
А что непонятно в последнем-то? Куда уж проще, кажется.
Неактивен