Я на Windows 10 и пытаюсь решить это с Winrar. Папка содержит 500 файлов, я хотел бы сжать каждые 10 из них в отдельный файл zip/rar и создать 50 файлов zip/rar.
Есть ли способ не делать это вручную?
Я на Windows 10 и пытаюсь решить это с Winrar. Папка содержит 500 файлов, я хотел бы сжать каждые 10 из них в отдельный файл zip/rar и создать 50 файлов zip/rar.
Есть ли способ не делать это вручную?
Вот скрипт, чтобы вы начали. Должен признаться, я не знаком с командной строкой 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%
)
Мое предложение было бы использовать что-то вроде собственного скрипта, который также даст вам хорошую гибкость.
Поскольку вы используете 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
представляет прогрессивный номер для каждого файла zip.
Сердцем сценария является командлет Compress-Archive
. Недавно он был представлен в PowerShell 5.0, которая поставляется по умолчанию в Windows 10.
Если вы немного знакомы с Powershell, сценарий можно легко улучшить, например, добавив CompressionLevel
или какой-нибудь текстовый вывод в консоль.
Также легко изменить количество файлов, которое вы хотите в каждом наборе, вам просто нужно изменить постоянное значение в следующей строке:
Set-Variable SET_SIZE -option Constant -value 10
Я кратко проверил сценарий, и он отлично работает - само собой разумеется, что вы должны сначала попробовать некоторые тестовые файлы.
Это улучшает решение 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-файл создается за один раз. Это может сократить время обработки и избежать возможной фрагментации диска.