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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-05 18:41:05

Уважаемые форумчане. Нужна помощь.
Необходимо написать скрипт, который закачивает файлы с нета на сервер (линки берет с файла), упаковывает каждый в zip архив, при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов. В конце выводит листинг zip архивов в файл. Заранее благодарен

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2009-04-05 20:03:51

пробуйте.
будет неполучаться - пишите.
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-05 21:10:08

logles писал(а):при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов.
зип стал поддерживать многотомные архивы?

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-05 22:34:19

zg писал(а):
logles писал(а):при этом, если архив больше 20 Мб, то разбивает его на несколько zip'ов.
зип стал поддерживать многотомные архивы?
не думаю. как вариант - файл больше 20 мб разбивать на части, которые затем архивировать

lissyara писал(а): пробуйте.
будет неполучаться - пишите.
хорошо, попробую разобраться

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-05 23:47:54

Понял, как работает. Вот только не знаю, как получить объем файла, как узнать, на сколько частей разобъет split, и как использовать полученный список файлов для архивации зипом?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-06 5:58:10

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, то и делить надо на столько же. Если остаток больше нуля, значит будет на одну часть больше.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-06 7:48:32

Гость писал(а):а опция `-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#

Аватара пользователя
f_andrey
майор
Сообщения: 2651
Зарегистрирован: 2007-12-26 1:22:58
Откуда: СПб
Контактная информация:

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

Непрочитанное сообщение f_andrey » 2009-04-06 8:00:37

zg писал(а):нету тут -s... да винрар не умеет делать многтомные зипы
man zip писал(а):-s splitsize
--split-size splitsize
zip -s 670m -r foo bar

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

uname -mr
8.0-CURRENT amd64
:ROFL: :ROFL: :ROFL:
Надо пользоваться ПРАВИЛЬНОЙ ОС
Если ваша тема перенесена, то смотри http://forum.lissyara.su/viewtopic.php?f=1&t=32308

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-06 9:10:42

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
ты, наверное, порты вообще не обновлял

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-06 9:39:52

Гость писал(а):ты, наверное, порты вообще не обновлял

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

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-06 14:38:50

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2009-04-07 20:39:20

я обновляю.
регулярно.
не сразу после выхода софта - чуть позже, но обновляю
Убей их всех! Бог потом рассортирует...

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-07 21:31:58

не совсем разобрался. может кто-нибудь из знающих подскажет готовое решение?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-08 5:59:11

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-08 6:00:12

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

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-09 13:10:43

Для начала у меня не выполняются скрипты путем указания имени файла скрипта. Пишу 1.sh, а в результате -
bash: 1.sh: command not found

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-09 16:09:57

logles писал(а):Для начала у меня не выполняются скрипты путем указания имени файла скрипта. Пишу 1.sh, а в результате -
bash: 1.sh: command not found

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

chmod +x 1.sh
./1.sh

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-09 22:44:49

Вот что у меня получилось:

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

#!/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: . Помогите довести до ума скрипт

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-10 7:10:07

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

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

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-10 17:56:01

скрипт выдает ошибку:

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

./1.sh: 13: Syntax error: Bad for loop variable
Вообще смысл цикла такой:
условие - пока j <= i, то выполнять переименование, архивирование, удаление исходных частей.
Как только будет упакована последняя часть, цикл заканчивается. Удаляется исходный разбиваемый файл.
Имена частей файлов - file.00*, где * - номер разбитой части (для простоты будем считать, что частей не больше 9)

При этом, установить новую версию зипа нет возможности.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2009-04-10 21:54:25

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

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#

logles
рядовой
Сообщения: 24
Зарегистрирован: 2008-12-24 20:36:31

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

Непрочитанное сообщение logles » 2009-04-11 0:12:47

Конечный результат таков:

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

#!/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
.....