Страница 1 из 2
Создание скрипта для wget
Добавлено: 2009-04-05 18:41:05
logles
Уважаемые форумчане. Нужна помощь.
Необходимо написать скрипт, который закачивает файлы с нета на сервер (линки берет с файла), упаковывает каждый в zip архив, при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов. В конце выводит листинг zip архивов в файл. Заранее благодарен
Re: Создание скрипта для wget
Добавлено: 2009-04-05 20:03:51
Alex Keda
пробуйте.
будет неполучаться - пишите.
Re: Создание скрипта для wget
Добавлено: 2009-04-05 21:10:08
zg
logles писал(а):при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов.
зип стал поддерживать многотомные архивы?
Re: Создание скрипта для wget
Добавлено: 2009-04-05 22:34:19
logles
zg писал(а):logles писал(а):при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов.
зип стал поддерживать многотомные архивы?
не думаю. как вариант - файл больше 20 мб разбивать на части, которые затем архивировать
lissyara писал(а):
пробуйте.
будет неполучаться - пишите.
хорошо, попробую разобраться
Re: Создание скрипта для wget
Добавлено: 2009-04-05 23:47:54
logles
Понял, как работает. Вот только не знаю, как получить объем файла, как узнать, на сколько частей разобъет split, и как использовать полученный список файлов для архивации зипом?
Re: Создание скрипта для wget
Добавлено: 2009-04-06 5:58:10
zg
logles писал(а):Вот только не знаю, как получить объем файла, как узнать, на сколько частей разобъет split, и как использовать полученный список файлов для архивации зипом?
гм.. тебе точно нужен zip? К примеру, 7z может спокойно делать многотомные архивы, да и сжатие получше.
Re: Создание скрипта для wget
Добавлено: 2009-04-06 6:32:06
Гость
zg писал(а):зип стал поддерживать многотомные архивы?
а опция `-s' там для чего тогда?
logles писал(а):Понял, как работает. Вот только не знаю, как получить объем файла,
Код: Выделить всё
$ eval $(stat -s emacs-23.0.92.tar.gz)
$ echo $st_size
29418924
$ limit=$((20 * 1 << 20 )) # 20 Mb
$ [ $st_size -gt $limit ] && echo st_size is bigger than 20Mb
st_size is bigger than 20Mb
$ echo "$((st_size / limit + (st_size % limit > 0))) parts total"
2 parts total
$ zip -s20m a.zip emacs-23.0.92.tar.gz
$ du -h a.z*
20M a.z01
8.0M a.zip
logles писал(а):как узнать, на сколько частей разобъет split
если бить по 20Mb, то и делить надо на столько же. Если остаток больше нуля, значит будет на одну часть больше.
Re: Создание скрипта для wget
Добавлено: 2009-04-06 7:48:32
zg
Гость писал(а):а опция `-s' там для чего тогда?
понятия не имею
Код: Выделить всё
zg# man zip | col -b | grep '\-s'
Good for exporting files to foreign operating-systems.
looking things, so zip instead maps them into VMS-style status codes.
in a pipe or on a non-seekable device. The old versions of zip or PKZIP
zg#
Код: Выделить всё
zg# zip
Copyright (c) 1990-2006 Info-ZIP - Type 'zip "-L"' for software license.
Zip 2.32 (June 19th 2006). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-R PKZIP recursion (see manual)
-e encrypt -n don't compress these suffixes
zg#
нету тут -s... да винрар не умеет делать многтомные зипы
Код: Выделить всё
zg# zip -s1m new
zip error: Invalid command arguments (no such option: s)
zg#
Re: Создание скрипта для wget
Добавлено: 2009-04-06 8:00:37
f_andrey
zg писал(а):нету тут -s... да винрар не умеет делать многтомные зипы
man zip писал(а):-s splitsize
--split-size splitsize
zip -s 670m -r foo bar
Надо пользоваться
ПРАВИЛЬНОЙ ОС
Re: Создание скрипта для wget
Добавлено: 2009-04-06 9:10:42
zg
f_andrey писал(а):
Надо пользоваться
ПРАВИЛЬНОЙ ОС
гм... а что в паривльный ос идут другие порты или встроили поддержку zip?
Код: Выделить всё
zg# which zip
zip: Команда не найдена.
zg# uname -a
FreeBSD zg.lissyara.su 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008 root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
zg#
Код: Выделить всё
zg# cat /usr/ports/archivers/zip/pkg-descr
Zip is a compression and file packaging utility. It is compatible with
PKZIP 2.04g (Phil Katz ZIP) for MSDOS systems. There is a companion to zip
called unzip (of course) which you can also install from the ports/package
system.
WWW: http://www.info-zip.org/Zip.html
zg#
Re: Создание скрипта для wget
Добавлено: 2009-04-06 9:15:40
Гость
zg писал(а):Zip 2.32 (June 19th 2006).
откуда у тебя такое старье? в портах archivers/zip содержит zip 3.0 и в нем
*есть*.
Код: Выделить всё
$ man zip | col -b | fgrep -- --split
--split-size splitsize
--split-bell
--split-pause
--split-verbose
`-s' - это сокращение от `--split-size'
Хмм, глядя в CVS-log Makefile'а обновление было не так давно, почти полгода назад
Код: Выделить всё
revision 1.37
date: 2008/08/03 03:18:25; author: ache; state: Exp; lines: +9 -7
Update to 3.0
ты, наверное, порты вообще не обновлял
Re: Создание скрипта для wget
Добавлено: 2009-04-06 9:39:52
zg
Гость писал(а):ты, наверное, порты вообще не обновлял
Код: Выделить всё
zg# pkg_version -v | grep zip
libzip-0.8 = up-to-date with port
p7zip-4.57 < needs updating (port has 4.65)
unzip-5.52_5 = up-to-date with port
zip-2.32 < needs updating (port has 3.0)
zg#
Гость писал(а):date: 2008/08/03 03:18:25;

я бы не стал делать такой скрипт на третьем зипе. Маленький он ещё, костылей можно охапку нацеплять.
Но то, что поддержку сделали, это клёво.
Re: Создание скрипта для wget
Добавлено: 2009-04-06 10:12:47
Гость
zg писал(а):Гость писал(а):date: 2008/08/03 03:18:25;
:ROFL: я бы не стал делать такой скрипт на третьем зипе. Маленький он ещё, костылей можно охапку нацеплять.
в срезе портов для 7.1 (4 января 2009) и 6.4 (28 ноября 2008) он должен быть. На 7.0 (27 февраля 2008) можно забить, ибо EOL уже под носом (30 апреля 2009). Только у пользователей 6.3 (18 января 2008) могут быть проблемы, однако поддержка касается только самой системы, а не портов.
а тех, кто пользует старый софт на неподдерживаемых более релизах (4.x, 5.x, 6.0-6.2, 7.0) можно смело отправить в печь^Wигнорировать
Note: unzip не поддерживает многотомные архивы ;)
Код: Выделить всё
$ unzip a.zip
Archive: a.zip
warning [a.zip]: zipfile claims to be last disk of a multi-part archive;
attempting to process anyway, assuming all parts have been concatenated
together in order. Expect "errors" and warnings...true multi-part support
doesn't exist yet (coming soon).
file #1: bad zipfile offset (local header sig): 4
как и написано в warning'е надо сперва их обработать через cat(1), напр
Код: Выделить всё
$ cat a.z* > b.zip
$ unzip b.zip
Archive: b.zip
warning [b.zip]: zipfile claims to be last disk of a multi-part archive;
attempting to process anyway, assuming all parts have been concatenated
together in order. Expect "errors" and warnings...true multi-part support
doesn't exist yet (coming soon).
warning [b.zip]: 20971520 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 20971524
(attempting to re-compensate)
inflating: emacs-23.0.92.tar.gz
Re: Создание скрипта для wget
Добавлено: 2009-04-06 14:38:50
zg
Гость писал(а):а тех, кто пользует старый софт на неподдерживаемых более релизах (4.x, 5.x, 6.0-6.2, 7.0) можно смело отправить в печь
да ну? вот к примеру хостинг от ру-центра
Код: Выделить всё
Last login: Sun Apr 5 10:17:28 2009 from 89.251.70.150
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 6.2-RELEASE-p8 (HNIC-SMP-ULE-IBM) #3: Tue Oct 28 13:45:07 MSK 2008
%zip
Copyright (c) 1990-2006 Info-ZIP - Type 'zip "-L"' for software license.
Zip 2.32 (June 19th 2006). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-R PKZIP recursion (see manual)
-e encrypt -n don't compress these suffixes
%
в печь?
Наш биллинг
Код: Выделить всё
Password:
Last login: Fri Apr 3 11:26:51 2009 from 89.251.70.150
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 6.1-RELEASE (STAT) #5: Wed Nov 5 15:49:13 YEKT 2008
Welcome to FreeBSD!
%zip
Copyright (C) 1990-2005 Info-ZIP
Type 'zip "-L"' for software license.
Zip 2.31 (March 8th 2005). Usage:
zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
The default action is to add or replace zipfile entries from list, which
can include the special name - to compress standard input.
If zipfile and list are omitted, zip compresses stdin to stdout.
-f freshen: only changed files -u update: only changed or new files
-d delete entries in zipfile -m move into zipfile (delete files)
-r recurse into directories -j junk (don't record) directory names
-0 store only -l convert LF to CR LF (-ll CR LF to LF)
-1 compress faster -9 compress better
-q quiet operation -v verbose operation/print version info
-c add one-line comments -z add zipfile comment
-@ read names from stdin -o make zipfile as old as latest entry
-x exclude the following names -i include only the following names
-F fix zipfile (-FF try harder) -D do not add directory entries
-A adjust self-extracting exe -J junk zipfile prefix (unzipsfx)
-T test zipfile integrity -X eXclude eXtra file attributes
-y store symbolic links as the link instead of the referenced file
-R PKZIP recursion (see manual)
-e encrypt -n don't compress these suffixes
%
тоже в печь?
гвест, ты уж извини

но я пока не видел серверов, которые обновляются каждый месяц два без веских на то причин. Если уж серевер работает, то он и будет работать и год и два и три и лазить в него смысла нет. Это если новый сервак настраивается, тогда да, претензий нет, но рабочие серваки никто не будет обновлять просто потому, что приспичело третий зип.
Re: Создание скрипта для wget
Добавлено: 2009-04-07 20:39:20
Alex Keda
я обновляю.
регулярно.
не сразу после выхода софта - чуть позже, но обновляю
Re: Создание скрипта для wget
Добавлено: 2009-04-07 21:31:58
logles
не совсем разобрался. может кто-нибудь из знающих подскажет готовое решение?
Re: Создание скрипта для wget
Добавлено: 2009-04-08 5:59:11
zg
lissyara писал(а):я обновляю.
регулярно.
не сразу после выхода софта - чуть позже, но обновляю
не все админы одинаково полезны

Re: Создание скрипта для wget
Добавлено: 2009-04-08 6:00:12
zg
logles писал(а):не совсем разобрался. может кто-нибудь из знающих подскажет готовое решение?
ты скрипт выложи, а то не совсем ясно куда рыть и чего тебе нехватает
Re: Создание скрипта для wget
Добавлено: 2009-04-09 13:10:43
logles
Для начала у меня не выполняются скрипты путем указания имени файла скрипта. Пишу 1.sh, а в результате -
bash: 1.sh: command not found
Re: Создание скрипта для wget
Добавлено: 2009-04-09 16:09:57
zg
logles писал(а):Для начала у меня не выполняются скрипты путем указания имени файла скрипта. Пишу 1.sh, а в результате -
bash: 1.sh: command not found
Re: Создание скрипта для wget
Добавлено: 2009-04-09 22:44:49
logles
Вот что у меня получилось:
Код: Выделить всё
#!/bin/sh
a=$(stat -c%s $1)
min=20971520
i=$(expr $a / $min)
i=$(expr $i + 1) #кол-во частей
if [$i -gt ]
then
split -a 3 -d -b 20m $1 file. #делит файл
for [j=1 -gt $i]
do
j0=$(expr $j - 1)
mv file.00${j0} file.00${j} #переименовывает файл для того, чтобы первым был *.001, а не *.000
zip file.00${j}.zip file.00${j}
rm -f file.00${j}
done
rm -f $1
echo 'ok'
fi
exit
Не уверен насчет содержимого цикла FOR. Преименовываю для того, чтобы в винде с помощью тотала можно было собрать

. Помогите довести до ума скрипт
Re: Создание скрипта для wget
Добавлено: 2009-04-10 7:10:07
zg
logles писал(а):Не уверен насчет содержимого цикла FOR.

я тоже неуверен, не только за содержимое, но и за условие цикла
logles писал(а):[j=1 -gt $i]
а что это выражение означает? распиши смысл каждой строки, тогда будет проще и тебе и нам -)
logles писал(а):Помогите довести до ума скрипт
если по-уму, то надо использовать третий зип с ключиком -s или 7z с тем же ключиком
Кстати скрипт работает?
Re: Создание скрипта для wget
Добавлено: 2009-04-10 17:56:01
logles
скрипт выдает ошибку:
Код: Выделить всё
./1.sh: 13: Syntax error: Bad for loop variable
Вообще смысл цикла такой:
условие - пока j <= i, то выполнять переименование, архивирование, удаление исходных частей.
Как только будет упакована последняя часть, цикл заканчивается. Удаляется исходный разбиваемый файл.
Имена частей файлов - file.00*, где * - номер разбитой части (для простоты будем считать, что частей не больше 9)
При этом, установить новую версию зипа нет возможности.
Re: Создание скрипта для wget
Добавлено: 2009-04-10 21:54:25
zg
Код: Выделить всё
zg# ls -l
total 2
-rwxr-xr-x 1 root wheel 208 10 апр 23:46 1.sh
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.000
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.001
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.002
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.003
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.009
-rw-r--r-- 1 root wheel 0 10 апр 23:44 file.rar.013
zg#
скрипт
Код: Выделить всё
#!/bin/sh
for FILE in `ls -1 file.* | sort -r`
do
POSITION=${FILE##*.}
POSITION=${POSITION##0}
NEW_NAME=${FILE%%[0-9][0-9][0-9]}$( printf '%03i' $(( $POSITION + 1 )) )
echo mv $FILE $NEW_NAME
done
результат работы
Код: Выделить всё
zg# ./1.sh
mv file.rar.013 file.rar.014
mv file.rar.009 file.rar.010
mv file.rar.003 file.rar.004
mv file.rar.002 file.rar.003
mv file.rar.001 file.rar.002
mv file.rar.000 file.rar.001
zg#
Re: Создание скрипта для wget
Добавлено: 2009-04-11 0:12:47
logles
Конечный результат таков:
Код: Выделить всё
#!/bin/sh
a=$(stat -c%s $1)
min=20971520
i=$(expr $a / $min)
if [ $i > 0 ]
then
split -a 3 -d -b 20m $1 file.
for FILE in `ls -1 file.* | sort -r`
do
POSITION=${FILE##*.}
POSITION=${POSITION##0}
NEW_NAME=${FILE%%[0-9][0-9][0-9]}$( printf '%03i' $(( $POSITION + 1 )) )
mv $FILE $NEW_NAME
zip $NEW_NAME.zip $NEW_NAME
rm -f $NEW_NAME
done
rm -f $1
echo Complete...
fi
exit
Вот только при нарезке большого файла скрипт споткнулся на файле с индексом 031:
Код: Выделить всё
adding: file.034 (deflated 1%)
adding: file.033 (deflated 0%)
adding: file.032 (deflated 0%)
adding: file.031
zip error: Interrupted (aborting)
Segmentation fault
adding: file.030^X^C
.....