Zip-архив с ограниченным количеством файлов

12

Какую команду я могу использовать для создания zipфайлов с ограничением числа файлов? У меня есть папка (без подпапок), скажем, 5000 файлов, поэтому я бы хотел команду, которая могла бы разделить это число и создать 10 отдельных zipархивов, каждый из которых состоит не более чем из 500 файлов.

Я также не хочу, чтобы полученные 10 zipфайлов были связаны друг с другом, так что я могу открыть их по отдельности, и мне не нужно будет открывать все 10 одновременно.

user8547
источник

Ответы:

13

Вы можете использовать GNU параллельно, чтобы сделать это, так как это может ограничить количество элементов для задания, а также предоставить номер задания (для уникального имени zip-архива):

$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
  adding: 1 (stored 0%)
  adding: 10 (stored 0%)
  adding: 11 (stored 0%)
  adding: 12 (stored 0%)
  adding: 13 (stored 0%)
  adding: 14 (stored 0%)
  adding: 15 (stored 0%)
  adding: 16 (stored 0%)
  adding: 17 (stored 0%)
  adding: 18 (stored 0%)
  adding: 19 (stored 0%)
  adding: 2 (stored 0%)
  adding: 20 (stored 0%)
  adding: 3 (stored 0%)
  adding: 4 (stored 0%)
  adding: 5 (stored 0%)
  adding: 6 (stored 0%)
  adding: 7 (stored 0%)
  adding: 8 (stored 0%)
  adding: 9 (stored 0%)
$ ls
1   11  13  15  17  19  20  4  6  8  arch1.zip  arch3.zip
10  12  14  16  18  2   3   5  7  9  arch2.zip  arch4.zip

Опция -N 5ограничивает количество файлов до 5 на один архив и представляется zipвместо{}

{#}(Дословно, а не заменить вас во время вызова), заменяется на количество рабочих мест, в результате чего arch1.zip, и arch2.zipт.д.

-print0Вариант findи -0вариант parallelв тандеме убедитесь , что имена файлов со специальными символами правильно обработаны.

Энтон
источник
Я получил эту ошибку: i.imgur.com/JoyPrfY.png Из этой команды: найти *! -имя "* .zip" -тип f -print0 | параллель -0 -N 500 zip arch {13} {}
user8547
@ user8547, который не является параллелью GNU, но параллелью, включенной в moreutils, вам лучше всего скомпилировать и установить из исходного кода, чтобы получить последние исправления безопасности. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 нет, просто беги sudo apt-get install parallel.
Terdon
2
@ user8547 почему arch{13}? Вам действительно нужно использовать #персонажа. Какую оболочку вы используете?
Anthon
2
@ user8547 Нет, это способ указать параллельному вводу номера задания, рад, что это сработало.
Anthon
1

Альтернатива только для оболочки: обрабатывать пакеты файлов COUNT через "${@:START:COUNT}"(диапазон позиционных параметров) и shift COUNTувеличивая счетчик cдля именования архивов:

задавать -- *
с = 1
while (($ #)); делать
  if [$ # -ge COUNT ]; тогда
    zip $ {c} .zip "$ {@: 1: COUNT }"
    с = $ ((с + 1))
    СЧЕТ СЧЕТА
  еще
    zip $ {c} .zip "$ {@}"
    сдвиг $ #
  фи
сделано
don_crissti
источник
1

Принятый ответ работал отлично для меня. :) НО, если у вас нет доступа к параллельному (кто знает почему), вот альтернатива, которую я придумал ранее:

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

Который создаст myarch1.zip, myarch2.zip, myarch3.zip и т. Д. Вы можете использовать трюк -0, предложенный Антоном, если у вас странные имена файлов.

MSB
источник