web-dev-qa-db-ja.com

フォルダ内の10個のファイルごとに個別のZipファイルとして圧縮するにはどうすればよいですか?

私はWindows10を使用していて、Winrarでそれを解決しようとしています。フォルダには500個のファイルが含まれています。10個ごとに個別のZip/rarファイルとして圧縮し、50個のZip/rarファイルを作成したいと思います。

手動で行わない方法はありますか?

2
Lafix

私の提案は、カスタムスクリプトのようなものを使用することです。これにより、柔軟性も向上します。

あなたは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するファイルを含むフォルダーを指定し、続いてZipファイルを含むフォルダーを指定します。例えば:

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

スクリプトは何をしますか?
基本的に、入力フォルダー内のすべてのファイルのリストを取得し、各ファイルは、プレフィックスが設定されるまで、出力フォルダー内の archive1.Zip ファイルに追加されます。サイズに達しました。その時点で、入力内のすべてのファイルが処理されるまで、以前と同じように、新しい archive2.Zip ファイルが作成されます。
結果のファイルはarchive<n>.Zipと呼ばれることに注意してください。ここで、nは各Zipファイルの累進番号を表します。

スクリプトの中心は Compress-Archiveコマンドレット です。最近、PowerShell 5.0で導入されました。これは、Windows10にデフォルトで付属しています。

Powershellを少し知っている場合は、たとえばCompressionLevelを追加したり、コンソールにテキスト出力を追加したりすることで、スクリプトを簡単に改善できます。

各セットに必要なファイルの数を変更することも簡単です。次の行の定数値を変更する必要があります。

Set-Variable SET_SIZE -option Constant -value 10

スクリプトを簡単にテストしましたが、正常に動作します。言うまでもなく、最初にいくつかのテストファイルを試してみる必要があります。

2
mguassa

これがあなたが始めるためのスクリプトです。私は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%
)
2
Berend

これにより、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ファイルはワンショットで作成されます。処理時間を短縮し、ディスクの断片化を防ぐことができます。

1
chingNotCHing