Страница 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' там для чего тогда?
понятия не имею :pardon:

Код: Выделить всё

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

Код: Выделить всё

uname -mr
8.0-CURRENT amd64
:ROFL: :ROFL: :ROFL:
Надо пользоваться ПРАВИЛЬНОЙ ОС

Re: Создание скрипта для wget

Добавлено: 2009-04-06 9:10:42
zg
f_andrey писал(а): :ROFL: :ROFL: :ROFL:
Надо пользоваться ПРАВИЛЬНОЙ ОС
гм... а что в паривльный ос идут другие порты или встроили поддержку 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;
:ROFL: я бы не стал делать такой скрипт на третьем зипе. Маленький он ещё, костылей можно охапку нацеплять.

Но то, что поддержку сделали, это клёво.

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
%
тоже в печь?

гвест, ты уж извини :pardon: но я пока не видел серверов, которые обновляются каждый месяц два без веских на то причин. Если уж серевер работает, то он и будет работать и год и два и три и лазить в него смысла нет. Это если новый сервак настраивается, тогда да, претензий нет, но рабочие серваки никто не будет обновлять просто потому, что приспичело третий зип.

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 писал(а):я обновляю.
регулярно.
не сразу после выхода софта - чуть позже, но обновляю
не все админы одинаково полезны :mrgreen:

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

Код: Выделить всё

chmod +x 1.sh
./1.sh

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. Преименовываю для того, чтобы в винде с помощью тотала можно было собрать :smile: . Помогите довести до ума скрипт

Re: Создание скрипта для wget

Добавлено: 2009-04-10 7:10:07
zg
logles писал(а):Не уверен насчет содержимого цикла FOR.
:smile: я тоже неуверен, не только за содержимое, но и за условие цикла
logles писал(а):[j=1 -gt $i]
а что это выражение означает? распиши смысл каждой строки, тогда будет проще и тебе и нам -)
logles писал(а):Помогите довести до ума скрипт
если по-уму, то надо использовать третий зип с ключиком -s или 7z с тем же ключиком :smile:

Кстати скрипт работает?

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
.....