Запаковка множества файлов по одному (Создание множества zip-архивов из множества файлов)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Vexhin
Сообщения: 78
ОС: Ubuntu 20.04 MATE

Запаковка множества файлов по одному

Сообщение Vexhin »

Имеется более сотни файлов в папке. Надо запаковать их в zip так чтобы создалось множество архивов zip, по одному файлу в архиве. Т. е. 001.htm 002.htm > 001.zip 002.zip и так далее. Не нашёл как сделать именно это, ни в Гугле ни в мане.
Заранее спасибо.
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Запаковка множества файлов по одному

Сообщение rm_ »


либо

либо

либо

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

lzop -U *

zip? А зачем?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Запаковка множества файлов по одному

Сообщение watashiwa_daredeska »

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

for f in *; do g=${f%.*}; zip "$g" "$f"; done
Файлы 001.html и 001.txt попадут-таки в один архив 001.zip.
Спасибо сказали:
Vexhin
Сообщения: 78
ОС: Ubuntu 20.04 MATE

Re: Запаковка множества файлов по одному

Сообщение Vexhin »

rm_ писал(а):
13.10.2009 19:32
zip? А зачем?

Я их собираюсь выложить на сайте, откуда их стопудово будут качать на компы с Windows.

watashiwa_daredeska писал(а):
13.10.2009 19:40

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

for f in *; do g=${f%.*}; zip "$g" "$f"; done
Файлы 001.html и 001.txt попадут-таки в один архив 001.zip.

Это не критично. У меня только *.htm
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Запаковка множества файлов по одному

Сообщение drBatty »

watashiwa_darede...
rm_
ваш код будет работать только если файлов мало. если максимальная длинна строки 32768, а имя файла с путём ~100 байт, то * развернётся максимум на 327 файлов. Что особенно неприятно, никаких сообщений не будет, часть файлов просто не обработается (так было у меня). Причём xargs не помогает. Лекарство:
1) список файлов записать во временный файл.
2) затем читать этот файл while read;do ... done < tmp.lst
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Запаковка множества файлов по одному

Сообщение eddy »

drBatty писал(а):
14.10.2009 10:50
Причём xargs не помогает

Воспользуйтесь find - проблемы с пробелами и большим кол-вом файлов не будет.

P.S. А вантузятники, между прочим, gzip-архивы спокойно открывают. Так что:

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

find ./ -type f -print0 | xargs -0 gzip
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
rm_
Сообщения: 3340
Статус: It's the GNU Age
ОС: Debian

Re: Запаковка множества файлов по одному

Сообщение rm_ »

drBatty писал(а):
14.10.2009 10:50
rm_
ваш код будет работать только если файлов мало. если максимальная длинна строки 32768, а имя файла с путём ~100 байт, то * развернётся максимум на 327 файлов.

Во-первых, звёздочка в командной строке экспандится в имя файла без пути.
Во-вторых, ограничение на длину ком.строки не 32768 (это не винда и не прочие отсталые системы), а гораздо больше.
10 тысяч файлов с длинными именами, строка почти в 400 килобайт - всё работает нормально:

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

rm@rm:~/tmp/test$ echo "<? for(\$i=0;\$i<10000;\$i++) touch(\"long_filename_number_\$i.uncompressed\"); ?>" | php
rm@rm:~/tmp/test$ echo * | wc -c
388890
rm@rm:~/tmp/test$ gzip *
rm@rm:~/tmp/test$ ls *.uncompressed
ls: cannot access *.uncompressed: No such file or directory
rm@rm:~/tmp/test$ echo *.gz | wc -c
418890
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Запаковка множества файлов по одному

Сообщение drBatty »

eddy писал(а):
14.10.2009 10:55
Воспользуйтесь find - проблемы с пробелами и большим кол-вом файлов не будет.

ага. тоже вариант:

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

 find . -iname "*.htm" -exec gzip {} \;


eddy писал(а):
14.10.2009 10:55
Так что:
Код
find ./ -type f -print0 | xargs -0 gzip

не пойдёт.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Запаковка множества файлов по одному

Сообщение drBatty »

rm_ писал(а):
14.10.2009 12:56
Во-вторых, ограничение на длину ком.строки не 32768 (это не винда и не прочие отсталые системы), а гораздо больше.

в слаке 12.2
configure:5946: checking the maximum length of command line arguments
configure:6066: result: 98304

в слаке 10.2 - 32768
rm_ писал(а):
14.10.2009 12:56
Во-первых, звёздочка в командной строке экспандится в имя файла без пути.

У вас - да. но выше было find -print0.
rm_ писал(а):
14.10.2009 12:56
10 тысяч файлов с длинными именами, строка почти в 400 килобайт - всё работает нормально:

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

ЗЫЖ

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

rm@rm:~/tmp/test$ gzip *

кстати, так обычно работает, видимо в развороте звёздочки есть какая-то оптимизация. однако она не срабатывает например на find | xargs.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Запаковка множества файлов по одному

Сообщение eddy »

drBatty писал(а):
14.10.2009 13:48
Цитата(eddy @ 14th October 2009 - в 11:55) *
Так что:
Код
find ./ -type f -print0 | xargs -0 gzip

не пойдёт.


Где не пойдет? Проверял эту строчку на куче файлов, причем в именах некоторых были пробелы - все нормально работает.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Запаковка множества файлов по одному

Сообщение drBatty »

eddy писал(а):
14.10.2009 14:35
Где не пойдет? Проверял эту строчку на куче файлов, причем в именах некоторых были пробелы - все нормально работает.

пробелы - нормально, любые символы кроме `/' и `\000' пойдут. Но много файлов не получится. И не надо пробовать, я вам верю, что на незагруженном десктопе с 2Гб памяти консольные проги работают, и жрут память сотнями метров.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Запаковка множества файлов по одному

Сообщение watashiwa_daredeska »

drBatty писал(а):
14.10.2009 10:50
ваш код будет работать только если файлов мало.
Нет. Ибо на for описанные ограничения не распространяются. Это ведь не внешняя команда.
Спасибо сказали: