Как сжать большую папку в маленькие файлы размером до 20 Мб?

10

Я ищу способ сжать большую папку во многие файлы 20 МБ. Я не хочу, чтобы почтовый файл разбивался на более мелкие. Вместо этого я хочу сгруппировать некоторые подфайлы / папки в группы, размер которых составляет 20 Мб в сжатом виде.

Если вы знаете, как это сделать, пожалуйста, помогите!

Обновить

Мне нужно использовать только меньшие заархивированные файлы, которые можно разархивировать в одиночку.

Я намерен использовать virustotal.com для сканирования большой папки.

Нам Г ВУ
источник
Какие-нибудь подробности об используемой операционной системе?
Питто
@Pitto я использую Windows-7
Nam G VU

Ответы:

10

В winzip: добавьте файлы в zip-архив, запустив winzip и добавив или перетащив его в winzip или щелкнув правой кнопкой мыши по файлам и winzip «add to zip ...»

Тогда в winzip:

Действия - Разделите в нижней части «Размер детали» выберите «Другой размер», затем поставьте 20 и выберите МБ

Выполнено!

адольф чеснок
источник
4
Пребывание на свободной стороне также 7zip работает отлично :)
Pitto
3
Это разделит zip-файл, и мы не сможем использовать только разделенные части.
Nam G VU
Боже, теперь я лучше понимаю, что вы ищете ... Тогда я просто не могу найти какое-либо решение вашей проблемы :( Как насчет использования бесплатного и чудесного Malwarebytes Antimalware для локального сканирования файлов?
Pitto
6

То, что вы предлагаете, - это, по сути, разновидность проблемы рюкзака , с добавленной особенностью, заключающейся в том, что из-за сжатия файла вы не начнете знать, сколько вашего 20-мегабайтного «рюкзака» займет каждый элемент.

Конечно, тривиальным решением будет просто сжать каждый файл независимо, но это не приведет к уменьшению количества файлов, поэтому я подозреваю, что это не будет удовлетворительным решением.

Если бы мне представили эту проблему, я бы начал с сжатия каждого файла по отдельности во временную папку (или в памяти, без записи их на диск), чтобы я мог получить приблизительный сжатый размер для каждого. С помощью этой информации можно будет решить, какие файлы следует сгруппировать, используя любой из стандартных подходов к проблеме ранца, и создать фактические zip-файлы.

Предполагая, что у вас есть язык сценариев, доступный для вас, и вы знаете, как его использовать, я ожидаю, что этот подход будет довольно простым для автоматизации; делать это вручную было бы довольно утомительно, если у вас есть больше, чем несколько файлов, чтобы иметь дело с ...

Дейв Шерохман
источник
1
Вы не можете молнии с «без сжатия»? Глядя на «обновление» оп, кажется, что формат файла важнее, чем сжатие.
Дорогой
1
Хех ... Хорошая мысль. Я не рассматривал использование zip как простого архива без сжатия.
Дейв Шерохман
@DaveSherohman Итак, как мы можем это сделать тогда?
Nam G VU
5

Позволить zip сделать разбиение для вас будет гораздо проще, чем пытаться понять это самостоятельно. Если ваша цель - zip-файлы размером 20 МБ, вам необходимо оценить сжатый размер каждого файла перед добавлением его в архив. Есть ли причина, по которой вы не хотите просто позволять zip делать разбиение для вас? Вот как вы можете сделать это с помощью gnu zip:

zip -s 20m -r myzip.zip mydir

Это создаст 20 МБ сжатых файлов с инкрементными индексными номерами в имени файла.

SethG
источник
4
Исходя из комментария ОП к другому ответу, похоже, что он не хочет, чтобы zip автоматически разбивал его, потому что тогда вы получаете один архив, который требует, чтобы все файлы функционировали должным образом, но он хочет, чтобы каждый фрагмент был полным, пригодным для использования архивом, независимым из других.
Дейв Шерохман
4

В Linux есть программа с именем zipsplit, которая делает именно это. Это часть стандартного пакета Zip.

Это можно запустить так:

zipsplit bigfile.zip -n 20000000

разделить bigfile.zip на части размером до 20 МБ. И обратите внимание, что отдельные содержащиеся файлы не будут разделены. Таким образом, каждая часть может быть расстегнута индивидуально. Это также означает, что если существует один файл, который не может вписаться в максимальный размер детали, разделение будет невозможно.

Обновление: Похоже, что на info-zip.org есть также двоичные файлы для Windows, в частности, в ftp://ftp.info-zip.org/pub/infozip/win32/zip300xn-x64.zip для Win 64.

Zitrax
источник
3

Боюсь, нелегкая перспектива.

Недавно я написал скрипт для сбора файлов в подкаталоги размером не более 4,3 ГБ для удобного хранения на DVD, но все это было без сжатия.

Делать это со сжатием - теперь есть проблема. Вы не можете предсказать размер файлов после сжатия - все, что вы можете сделать, это добавлять файлы в zip в порядке убывания размера, пока он не превысит 20 МБ, а затем удалить последний файл, заменив его меньшим, пока он не упадет ниже 20 МБ. , Если вы исчерпали все файлы и они все еще имеют размер> 20 МБ, просто отбросьте последний файл и переходите к следующему zip.

Довольно сложный сценарий и довольно медленный, болезненный процесс.

Majenko
источник
Здесь моя мысль. Почему бы просто не сгруппировать файлы / папки в разархивированную группу <= 20 МБ, а затем сжать их? Нам не нужно, чтобы файлы результатов .zip занимали по 20 МБ каждый.
Nam G VU
Возможно - не уверен, как бы вы поступили в Windows с использованием сценариев - я раньше использовал Perl на Linux.
Majenko
2

Я знаю, что это старая тема, но я только что сделал это с 7-Zip .

Вам нужно использовать опцию «Split to Volume»:

введите описание изображения здесь

Кевин Кушик
источник
Круто. Я постараюсь вернуться позже.
Nam G VU
1
Не работает для этого конкретного сценария, потому что меньшие заархивированные файлы не могут быть распакованы в одиночку; они должны быть вместе.
просмотрись
2

Дэйв, казалось, предоставил самое близкое программируемое решение к тому, что запросил OP. Я понял, что это можно сделать и вручную , если принять следующие допущения (это не чисто техническая проблема - это скорее организационная проблема, чем техническая):

  1. Поскольку OP требует, чтобы каждый zip-файл мог извлекать все его содержимое независимо , файлы, размер которых превышает 20 МБ после архивирования, должны обрабатываться одним из следующих способов:
    • они не должны рассматриваться, и поэтому должны быть отделены;
    • их нужно разделить на тома по 20 МБ, как предлагали другие ответы ( winzip , 7-zip ), и полученные файлы нельзя использовать независимо (нарушая это первое предположение).
  2. Заархивированные файлы не обязательно должны иметь ровно 20 МБ.
  3. Если более важно иметь несколько zip-файлов размером приблизительно 20 МБ, то сжатие может быть выполнено без сжатия.

Используя этот метод с 7-zip (интерфейс и терминал Windows), я сохранил сжатие во вновь созданных zip-файлах.

Начните с архивирования всех файлов в один zip-файл в пустой папке (с желаемым методом сжатия), например ALL.zip, и откройте его:

  1. Упорядочить список файлов и папок, нажав на столбец размера или упакованного размера (сжатый);
  2. Начните с самых маленьких размеров и выберите файлы / папки, которые вы хотите сгруппировать в zip;
  3. Нажмите Testкнопку, чтобы подтвердить их общий размер (это учитывает их сжатие): Тестовая функция
  4. Нажмите Extractили Copyкнопку, добавляя к концу пути извлечения имени в новой папке (например: plu_8MB)
  5. Внутри ALL.zipzip удалите только что извлеченные файлы (избегая ошибочных повторных извлечений) и перейдите к следующей папке или подмножеству файлов;
  6. Повторите одно из следующих действий:
    • шаги с 1 по 5, если вы планируете создать независимый zip-файл;
    • шаги с 1 по 3 и повторное использование одного и того же имени папки (шаг 4) до тех пор, пока их общие размеры не станут примерно 20 МБ;
  7. После того, как вы извлекли все содержимое ALL.zipв независимые папки, удалите этот zip и откройте терминал в этой папке ;
  8. Тип:

    for /F %i in ('dir /b') do "C:\Program Files\7-zip\7z.exe" a -tzip %i.zip %i
    

    Нажмите, ENTERи это создаст ZIP-файл для каждой папки, которую вы только что извлекли.

CPHPython
источник
Для различных параметров в рекомпрессии, вот документация синтаксиса 7zip .
CPHPython