Comment créer des fichiers zip séparés pour chaque fichier / répertoire sélectionné dans 7zip?

31

Voici le pack zip interne de Total Commander:

Une image de la boîte de dialogue du pack zip de Total Commander.

Cependant, je veux utiliser mon packer 7zip. Lorsque je sélectionne 5 fichiers, j'obtiens 5 archives .zip distinctes pour chaque fichier sélectionné. Comment faire ça dans 7zip?

Ours grincheux
la source

Réponses:

54

Je ne suis pas sûr que vous puissiez faire ce que vous proposez en utilisant l'interface utilisateur graphique, mais vous pouvez certainement le faire à partir de la ligne de commande:

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"

Vous devez d'abord changer le répertoire (la cdcommande) en F:\Downloadsrépertoire, ou tout répertoire dans lequel vous souhaitez effectuer la compression de masse. En outre, il est assez facile de remplacer le fichier * .exe ou l'extension que vous souhaitez filtrer pour compresser ces documents.

Et l'anneau de décodeur secret:

  • %i est une variable qui contient le nom du fichier pour chaque étape de la boucle
  • (*.*) est le critère de sélection, il pourrait facilement être * .exe ou similaire
  • 7z.exe est la version en ligne de commande de 7-Zip
  • %~ni - cela étend la variable% i au seul nom de fichier - pas d'extension

Si vous vouliez simplement ajouter les dossiers pour un répertoire donné, la commande est un peu plus complexe car par défaut, FOR fonctionne uniquement avec les fichiers. Nous devons lui fournir quelques informations supplémentaires:

FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"

Cela fonctionne à cause de quelques morceaux de ce qui semble magique:

  • /F indique à FOR d'itérer sur la valeur développée dans ()
  • usebackq dit à FOR que je vais passer une commande et utiliser la sortie pour itérer
  • delims=?dit à FOR que je veux séparer les jetons sur le ?- un caractère illégal dans les noms de fichiers et les répertoires. Je veux seulement un jeton.
  • L' /Bentrée DIRest pour le format nu - juste le nom
  • Le /A:Din DIRest pour restreindre les résultats par attribut, le D est pour les répertoires

Si vous souhaitez encapsuler cela à l'intérieur d'un fichier de commandes, la seule modification que vous devrez faire est de doubler la variable% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
la source
Oui, sauf que la vôtre est une archive 7z, je veux une archive zip! Alors% ~ ni.zip à la place?
Grumpy ol 'Bear
Mieux encore, je veux zip ou 7z avec ultra compression. ET emballez-le dans d: \ emballé. Mais jusqu'à présent, votre méthode fonctionne!
Grumpy ol 'Bear
1
Je l'ai. Merci! POUR% i DANS ( . ) DO 7z.exe un "i: \ emballé \% ~ ni.7z" "% i" -mx9
Grincheux de l'ours le
Au fait, pouvez-vous me montrer comment faire cela dans un fichier batch? ie sperate-archive.bat
Grumpy ol 'Bear
Merci, et comment ajouter des dossiers entiers à ce script, s'il vous plaît?
Grumpy ol 'Bear
16

J'aime la réponse de Goyuix. Cependant, si vous utilisez Windows 7 (ou si Power Shell est installé) et utilisez également la version en ligne de commande de 7-zip, 7za.exe, vous pouvez exécuter cette commande:

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Vous pouvez également changer "dir" en "dir * .exe" pour sélectionner uniquement les fichiers exécutables.

Une bonne chose à propos de Power Shell est que vous travaillez avec des objets au lieu de chaînes. Vous pouvez donc être vraiment précis si vous le souhaitez. Par exemple:

dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Cela inclura uniquement les fichiers qui:

  1. avoir une extension csv
  2. taille inférieure à 18 900 octets
  3. dernière modification le 7/1/2011 ou après

MODIFIER Si vous voulez des fichiers zip au lieu de fichiers 7-zip, utilisez plutôt zip.exe d'InfoZip .

jftuga
la source
4
7-zip peut également créer des fichiers zip - jetez un œil au drapeau -t. Exemple:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Name fonctionne, mais comment faire $ _. BaseName $ _. Name sur un autre lecteur, dans un autre répertoire? Dites f: \ test \ file1.7z etc.
Grumpy ol 'Bear
0

Vous pouvez télécharger et installer le plugin 7zip pour Total Commander sur http://www.ghisler.com/plugins.htm Une fois que vous avez fait cela sur le côté droit de la fenêtre de votre capture d'écran, il y aura une autre sélection pour la compression 7zip. Avec cette option, vous pouvez accomplir exactement ce que vous demandez.

Mxx
la source
0

Je viens de travailler exactement sur ce problème et l'un des problèmes que j'ai trouvés était la duplication du nom de dossier dans l'archive, c'est-à-dire lors de la compression d'un dossier appelé "foo", une archive contenant .\foo\fighters.txtest produite au lieu d'une seule contenant fighters.txt.

La réponse est donc d'aller dans le répertoire en cours de traitement et de faire apparaître l'archive dans le répertoire précédent (racine), puis de revenir dans ce répertoire afin de traiter le dossier suivant.

Il est également important que 7ZIP ignore les fichiers ZIP et CMD existants dans le répertoire racine pour éviter qu'ils ne se retrouvent dans l'archive, d'où les arguments -x!*.zipet -x!*.cmdexclusion.

Ce script conservera également des structures de dossiers récursives.

@echo off

REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal

if exist *.zip goto zip_exist

for /d %%X in (*) do (
    cls
    cd /D %%X
    "e:\Program Files\7-Zip\7z.exe" a -r  -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
    cd ..
)
goto end

:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.

:end
pause

Le code ci-dessus doit être copié dans un fichier de commandes tel que "compress_dirs.cmd" et exécuté en tant qu'administrateur à partir du répertoire contenant les dossiers que vous souhaitez compresser.

J'espère que cela t'aides.

Pi Hard
la source
0

Si vous devez conserver la structure des dossiers et enregistrer chaque fichier dans sa propre structure, essayez ceci:

Enregistrez cette commande dans un fichier avec l'extension .bat et placez-la dans le dossier que vous devez compresser:

FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel

Remarque:

-sdel: supprime le fichier d'origine (facultatif, si vous souhaitez uniquement conserver le fichier compressé)

l'amour en direct
la source