![如何将文件夹中的每 10 个文件压缩为单独的 zip 文件?](https://linux22.com/image/1479453/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E6%AF%8F%2010%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%8E%8B%E7%BC%A9%E4%B8%BA%E5%8D%95%E7%8B%AC%E7%9A%84%20zip%20%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我在 Windows 10 上,正在尝试使用 Winrar 解决这个问题。该文件夹包含 500 个文件,我想将其中每 10 个文件压缩为单独的 zip/rar 文件,并创建 50 个 zip/rar 文件。
有没有办法不手动操作呢?
答案1
我的建议是使用类似自定义脚本的东西,它也能给你带来很好的灵活性。
由于您使用的是 Windows,我很快开发了一个简单的PowerShell 脚本为你甚至不需要 WinRAR。
创建一个.ps1文本文件(例如创建-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
该脚本的作用是什么?
基本上,它会获取输入文件夹中所有文件的列表,然后将每个文件添加到存档1.zip输出文件夹中的文件,直到达到预设的大小。此时,一个新的存档2.zip创建文件,与之前相同……依此类推,直到处理完输入中的所有文件。
请注意,生成的文件称为archive<n>.zip
,其中n
表示每个 zip 文件的渐进编号。
剧本的核心是Compress-Archive
命令。它是最近随 PowerShell 5.0 引入的,是 Windows 10 的默认功能。
如果您对 Powershell 有所了解,那么可以轻松改进该脚本,例如通过CompressionLevel
向控制台添加 或一些文本输出。
更改每组中所需文件的数量也很简单,只需修改以下行中的常量值:
Set-Variable SET_SIZE -option Constant -value 10
我已经对该脚本进行了简单的测试并且它运行良好 - 不用说你应该先在一些测试文件上尝试一下。
答案2
这是帮助您入门的脚本。我必须承认我不熟悉 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%
)
答案3
这通过将 500 个压缩操作减少到 50 个来改进 mguassa 的解决方案。
$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 文件都是一次性创建的。这可以减少处理时间并避免可能产生的磁盘碎片。