Архів Zip з обмеженою кількістю файлів


12

Яку команду можна використовувати для створення zips з обмеженням кількості файлів? У мене є папка (без підпапок) з, скажімо, 5000 файлів, тому я хотів би команду, яка могла б поділити це число і створити 10 окремих zipархівів, кожен складається з не більше 500 файлів.

Я також не хочу, щоб отримані 10 zipфайлів були пов'язані між собою, так що я можу відкривати їх окремо і не потрібно буде відкривати всі 10 одночасно.

Відповіді:


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 З цієї команди: знайдіть *! -name "* .zip" -тип f -print0 | паралельна -0 -N 500 zip arch {13} {}
user8547

@ user8547 це не паралель GNU, але паралель, включена до moreutils, найкраще компілювати та встановлювати з джерела, щоб отримати останні патчі безпеки. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Антон

2
@ user8547 ні, просто запустіть sudo apt-get install parallel.
terdon

2
@ user8547 чому arch{13}? Вам справді потрібно використовувати #символ. Яку оболонку ви використовуєте?
Антон

2
@ user8547 Ні, це спосіб сказати паралельно, щоб поставити номер роботи там, радий, що це вийшло.
Антон

1

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

набір - *
c = 1
while (($ $)); робити
  якщо [$ # -ge COUNT ]; тоді
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    зміна COUNT
  ще
    zip $ {c} .zip "$ {@}"
    зрушення $ #
  фі
зроблено

1

Прийнята відповідь для мене спрацювала прекрасно. :) Але, якщо у вас немає доступу до паралелі (хто знає чому), ось альтернативу, яку я придумав раніше:

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

Що створить myarch1.zip, myarch2.zip, myarch3.zip і т. Д. Можливо, ви хочете скористатися хитрістю -0, яку запропонував Ентон, якщо у вас є дивні назви файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.