Как мне сжать каждые 10 файлов в папке как отдельный zip-файл?

1639
Lafix

Я на Windows 10 и пытаюсь решить это с Winrar. Папка содержит 500 файлов, я хотел бы сжать каждые 10 из них в отдельный файл zip / rar и создать 50 файлов zip / rar.

Есть ли способ не делать это вручную?

2

3 ответа на вопрос

1
Berend

Вот скрипт, чтобы вы начали. Должен признаться, я не знаком с командной строкой rar, так что, возможно, вам придется изменить это.

@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% ) 
1
mguassa

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

Поскольку вы используете Windows, я быстро разработал для вас простой скрипт PowerShell , который даже не требует WinRAR .

Создайте текстовый файл .ps1 (например, Create-MultiZip.ps1 ) со следующим содержимым:

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++; } } 

Затем запустите его в среде PowerShell, предоставив папку, содержащую файлы, которые вы хотите сжать, а затем папку, в которой будут находиться файлы ZIP. Например:

Create-MultiZip.ps1 C:\tmp\input C:\tmp\output 

Что делает скрипт?
Обычно он получает список всех файлов во входной папке, затем каждый файл добавляется в файл archive1.zip в выходной папке, пока не будет достигнут размер префикса набора. В этот момент создается новый файл archive2.zip, такой же, как прежде ... и так далее, пока все входные файлы не будут обработаны.
Обратите внимание, что получающиеся файлы называются archive<n>.zip, где nпредставляет прогрессивное число для каждого файла почтового индекса.

Сердцем сценария является командлет . Недавно он был представлен в PowerShell 5.0, которая поставляется по умолчанию в Windows 10.Compress-Archive

Если вы немного знакомы с Powershell, сценарий можно легко улучшить, например, добавив CompressionLevelв консоль текстовый вывод или какой-либо текст.

Также легко изменить количество файлов, которое вы хотите в каждом наборе, вам просто нужно изменить постоянное значение в следующей строке:

Set-Variable SET_SIZE -option Constant -value 10 

Я кратко проверил сценарий, и он отлично работает - само собой разумеется, что вы должны сначала попробовать некоторые тестовые файлы.

0
chingNotCHing

Это улучшает решение mguassa за счет сокращения 500 операций сжатия до 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") } 

Выходные zip-файлы называются app0.zip, app1.zip, ... в соответствии с именем входной папки в выходной папке.

Каждый zip-файл создается за один раз. Это может сократить время обработки и избежать возможной фрагментации диска.

Похожие вопросы