Каковы некоторые стратегии архивирования большой древовидной структуры папок в отдельные zip-файлы [закрыто]

Вопрос или проблема

Операционная система – Windows.

Я могу использовать Winzip для архивации большой папки в разделенные zip-файлы. Например (маленькие разделы для обсуждения):

k:\abc\def\myroot… содержит 100MB, и Winzip с лимитом раздела 5MB архивирует в

myroot.z01
myroot.z02
myroot.z03
myroot.z04
myroot.zip

Разделы перемещаются в другое место, которое принимает только .zip файлы, и согласно Winzip, похоже, что .z## файлы не могут быть открыты другими программами для распаковки

Есть ли способ с помощью Winzip или, возможно, powershell создать независимые архивы, которые в совокупности покрывают ‘root’?

myroot_1of6.zip
myroot_2of6.zip
myroot_3of6.zip
myroot_4of6.zip
myroot_5of6.zip
myroot_6of6.zip

Ни один из отдельных файлов не будет сжат до размера больше лимита раздела. В худшем случае это что-то вроде сжатия папки 1.75 TiB в N zip-файлов менее 50GiB каждый.

.

Ответ или решение

Архивирование большого дерева каталогов в отдельные zip-файлы может представлять собой сложность, особенно в среде Windows, где возможности встроенных инструментов может не хватать для специфичных задач, таких как создание независимых архивов вместо непрерывных частей одного архива. В этой ситуации мы рассмотрим стратегии, которые могут быть применены для достижения цели с использованием WinZip, PowerShell и других средств.

Теория

Основная задача заключается в создании нескольких независимых zip-архивов, охватывающих целиком содержимое корневого каталога, где каждый из архивов имеет ограничение по размеру, например, не более 50 ГиБ. Эта задача имеет несколько подводных камней, таких как совместимость архивов с различными программами для распаковки и необходимость автоматизации процесса для больших объемов данных (например, 1,75 ТиБ).

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

Пример

Предположим, что у нас есть директория k:\abc\def\myroot, содержащая 1,75 ТиБ данных, и необходимо создать несколько zip-файлов, каждый из которых не превышает 50 ГиБ. Ни один из отдельных файлов внутри не превышает указанное ограничение по размеру. За основу возьмем такие примеры:

  • WinZip: хотя он позволяет создавать .z## части, мы ищем способ получить независимые архивы.
  • PowerShell: может использоваться для автоматизации процесса архивации и разделения данных на части.

Применение

  1. WinZip: Для достижения цели с использованием WinZip без создания зависимых частей, вы можете иcпользовать пакетную обработку и/или скрипт на языке, поддерживающем автоматизацию, например Python или VBA, которые будут обрабатывать каждый файл/подкаталог отдельно. Однако, это не всегда эффективно для больших объемов данных и может требовать значительных временных затрат.

  2. PowerShell: Использование скриптовых возможностей PowerShell открывает широкие возможности для автоматизации и настройки процесса. Вот пример возможного скрипта для создания независимых архивов:

    param(
       [string]$SourceFolder = "K:\abc\def\myroot",
       [string]$DestinationFolder = "K:\archives",
       [int]$MaxArchiveSizeGB = 50
    )
    
    $files = Get-ChildItem -Path $SourceFolder -Recurse | Sort-Object Length -Descending
    $currentSize = 0
    $archiveIndex = 1
    $archiveFiles = @()
    
    foreach ($file in $files) {
       if (($currentSize + $file.Length) -ge ($MaxArchiveSizeGB * 1GB)) {
           Compress-Archive -Path $archiveFiles -DestinationPath "$DestinationFolder\myroot_$archiveIndex.zip"
           $archiveIndex++
           $archiveFiles = @()
           $currentSize = 0
       }
    
       $archiveFiles += $file.FullName
       $currentSize += $file.Length
    }
    
    # Archive remaining files
    if ($archiveFiles.Count -gt 0) {
       Compress-Archive -Path $archiveFiles -DestinationPath "$DestinationFolder\myroot_$archiveIndex.zip"
    }

    Этот скрипт автоматически делит файлы на архивы, не превышающие 50 ГиБ. Он создает независимые zip-файлы, которые можно распаковать любой стандартной программой, поддерживающей формат zip.

  3. Дополнительные инструменты:

    • 7-Zip: Альтернатива WinZip, поддерживающая более широкую совместимость с различными распаковщиками и предлагающая командную строку для автоматизации.
    • Python: Используя библиотеки вроде shutil и os, вы можете писать более сложные скрипты с возможностью интеграции более продвинутых алгоритмов разделения и сжатия.

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

Оцените материал
Добавить комментарий

Капча загружается...