Respostas:
Minha sugestão seria usar algo como um script personalizado, o que também lhe daria uma boa flexibilidade.
Como você está usando o Windows, desenvolvi rapidamente um script simples do PowerShell para você que nem exige o WinRAR .
Criar um .ps1 arquivo de texto (por exemplo, criar-MultiZip.ps1 ) com o seguinte conteúdo:
param
(
# The input folder containing the files to zip
[Parameter(Mandatory = $true)]
[string] $InputFolder,
# The output folder that will contain the zip files
[Parameter(Mandatory = $true)]
[string] $OutputFolder
)
Set-Variable SET_SIZE -option Constant -value 10
$i = 0
$zipSet = 0
Get-ChildItem $InputFolder | ForEach-Object {
$zipSetName = "archive" + ($zipSet + 1) + ".zip"
Compress-Archive -Path $_.FullName -Update -DestinationPath "$OutputFolder\$zipSetName"
$i++;
if ($i -eq $SET_SIZE) {
$i = 0;
$zipSet++;
}
}
Em seguida, execute-o em um ambiente do PowerShell, fornecendo a pasta que contém os arquivos que você deseja compactar, seguida pela pasta que conterá os arquivos zip. Por exemplo:
Create-MultiZip.ps1 C:\tmp\input C:\tmp\output
O que o script faz?
Basicamente, ele obtém uma lista de todos os arquivos na pasta de entrada e, em seguida, cada arquivo é adicionado ao arquivo archive1.zip na pasta de saída, até que o tamanho do conjunto prefixado seja atingido. Nesse ponto, um novo arquivo archive2.zip é criado, o mesmo de antes ... e assim por diante, até que todos os arquivos na entrada tenham sido processados.
Observe que os arquivos resultantes são chamados archive<n>.zip
, onde n
representa o número progressivo de cada arquivo zip.
O coração do script é o cmdlet . Foi introduzido recentemente com o PowerShell 5.0, que vem por padrão no Windows 10.Compress-Archive
Se você conhece um pouco o Powershell, o script pode ser facilmente aprimorado, por exemplo, adicionando uma CompressionLevel
ou alguma saída de texto ao console.
Também é fácil alterar o número de arquivos que você deseja em cada conjunto, basta modificar o valor constante na seguinte linha:
Set-Variable SET_SIZE -option Constant -value 10
Testei o script brevemente e ele funciona bem - nem é preciso dizer que você deve testar alguns arquivos de teste primeiro.
Aqui está um script para você começar. Devo confessar que não estou familiarizado com a linha de comando rar, então você pode precisar ajustá-la.
@echo off
Setlocal EnableDelayedExpansion
:: Folder containing files
set input=D:\temp
:: Folder for zips
set output=D:\output
:: Temp filename to hold list of 10
set listfile=%temp%\listfile
:: Zip counter
set z=1
:: Files per zip
set n=10
cd /d %input%
if exist %listfile% del %listfile%
set i=0
for %%f in (*.*) do (
set /a i=!i! + 1
echo %%f >> %listfile%
if !i!==%n% (
rar a %output%\!z!.rar @%listfile%
set i=0
set /a z=!z! + 1
del %listfile%
)
)
:: Process remaining files, if any
if exist %listfile% (
rar a %output%\!z!.rar @%listfile%
del %listfile%
)
Isso melhora a solução da mguassa, reduzindo 500 ações de compressão para 50.
$InputFolder = "c:\users\ching\Downloads\app"
$OutputFolder = "c:\users\ching\Downloads\arc"
$filesPerZip = 10
$counter = [PSCustomObject] @{ Value = 0 }
$arcs = gci $InputFolder | ?{!$_.PsIsContainer} | group {[Math]::Floor($counter.Value++ / $filesPerZip)}
cd $InputFolder
$OutputZipPrefix = $OutputFolder + "\" + ($InputFolder | Split-path -leaf)
foreach ($arc in $arcs) {
compress-archive $arc.group ($OutputZipPrefix + $arc.name + ".zip")
}
Os arquivos zip de saída são nomeados como app0.zip, app1.zip, ... de acordo com o nome da pasta de entrada na pasta de saída.
Todo arquivo zip é criado de uma só vez. Pode reduzir o tempo de processamento e evitar possíveis fragmentações de disco.