2 votes

Comment puis-je compresser tous les 10 fichiers d'un dossier dans un fichier zip séparé ?

Je suis sous Windows 10 et j'essaie de résoudre le problème avec Winrar. Le dossier contient 500 fichiers, je voudrais compresser chacun des 10 fichiers comme un fichier zip/rar séparé et créer 50 fichiers zip/rar.

Existe-t-il un moyen de ne pas le faire manuellement ?

2voto

Berend Points 2425

Voici un script pour vous aider à démarrer. Je dois avouer que je ne suis pas familier avec la ligne de commande rar, donc vous devrez peut-être la modifier.

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

2voto

mguassa Points 1584

Ma suggestion serait d'utiliser quelque chose comme un script personnalisé, qui serait vous donnerait également une bonne flexibilité.

Puisque vous utilisez Windows, j'ai rapidement développé une simple PowerShell script pour vous qui ne nécessite même pas WinRAR .

Créer un .ps1 fichier texte (par exemple Créer-MultiZip.ps1 ) avec le contenu suivant :

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

Exécutez-la ensuite dans un environnement PowerShell, en fournissant le dossier contenant le fichier fichiers à compresser, suivi du dossier qui contiendra les fichiers compressés. zip. Par exemple :

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

Que fait le script ?
Fondamentalement, il obtient une liste de tous les fichiers dans le dossier d'entrée, puis chaque fichier est ajouté à la liste des fichiers. archive1.zip dans le dossier de sortie, jusqu'à ce que la taille de l'ensemble préfixé soit atteinte. À ce moment-là, un nouveau fichier archive2.zip est créé, comme précédemment... et ainsi de suite, jusqu'à ce que tous les fichiers en entrée aient été traités.
Notez que les fichiers résultants sont appelés archive<n>.zipn représente le numéro progressif pour chaque fichier zip.

Le cœur du script est la fonction Compress-Archive cmdlet . Il a récemment été introduit dans PowerShell 5.0, qui est fourni par défaut dans Windows 10.

Si vous connaissez un peu Powershell, le script peut être facilement amélioré, par exemple en ajoutant une balise CompressionLevel ou une sortie de texte dans la console.

Il est également simple de changer le nombre de fichiers que vous voulez dans chaque ensemble, il suffit de modifier la valeur constante à la ligne suivante :

Set-Variable SET_SIZE -option Constant -value 10

J'ai testé le script brièvement et il fonctionne bien - il va sans dire que vous devriez l'essayer sur quelques fichiers de test d'abord.

1voto

John Points 109

Cela améliore la solution de mguassa en réduisant 500 actions de compression à 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")
}

Les fichiers zip de sortie sont nommés app0.zip, app1.zip,... en fonction du nom du dossier d'entrée dans le dossier de sortie.

Chaque fichier zip est créé en une seule fois. Cela permet de réduire le temps de traitement et d'éviter une éventuelle fragmentation du disque.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X