Como posso compactar a cada 10 arquivos em uma pasta como um arquivo zip separado?

2

Estou no Windows 10 e tentando resolvê-lo com o Winrar. A pasta contém 500 arquivos, eu gostaria de compactar cada 10 deles como um arquivo zip / rar separado e criar 50 arquivos zip / rar.

Existe uma maneira de não fazer isso manualmente?

    
por Lafix 06.01.2016 / 08:50

3 respostas

1

Minha sugestão seria usar algo como um script personalizado, que seria também lhe dá uma boa flexibilidade.

Como você está usando o Windows, desenvolvi rapidamente um script do PowerShell simples para você que nem exige o WinRAR .

Crie um arquivo de texto .ps1 (por exemplo, Create-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 o arquivos que você deseja compactar, seguidos pela pasta que conterá o zip arquivos. 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, então 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 de archive<n>.zip , em que n representa o número progressivo de cada arquivo zip.

O coração do script é o Compress-Archive cmdlet . Foi introduzido recentemente com o PowerShell 5.0, que vem por padrão no Windows 10.

Se você conhece o Powershell um pouco, o script pode ser facilmente melhorado, por exemplo, adicionando um CompressionLevel ou alguma saída de texto ao console.

Também é simples 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

Eu testei o script rapidamente e ele funciona bem - não é preciso dizer que você deve testar alguns arquivos de teste primeiro.

    
por 07.01.2016 / 21:22
1

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 ajustar isso.

@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%
)
    
por 06.01.2016 / 09:18
0

Isso melhora a solução do mguassa ao reduzir 500 ações de compactaçã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.

Cada arquivo zip é criado em uma única vez. Pode reduzir o tempo de processamento e evitar possíveis fragmentações de disco.

    
por 10.01.2016 / 13:38