41 votes

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

Ceci est le packer zip interne de Total Commander:

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

Cependant, je veux utiliser mon packer 7zip. Lorsque je sélectionne 5 fichiers, j'obtiens 5 archives .zip séparées pour chaque fichier sélectionné. Comment puis-je faire cela dans 7zip?

74voto

Duckboy Points 227

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

POUR %i DANS (*.*) FAIRE 7z.exe a "%~ni.7z" "%i"

Vous devriez changer de répertoire (avec la commande cd) vers le répertoire F:\Téléchargements en premier lieu, ou vers n'importe quel répertoire dans lequel vous souhaitez effectuer la compression en masse. De plus, il est assez facile de remplacer *.exe ou n'importe quelle extension par laquelle vous désirez filtrer pour compresser juste ces documents.

Et maintenant, le 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, cela pourrait facilement être *.exe ou similaire
  • 7z.exe est la version en ligne de commande de 7-Zip
  • %~ni - ceci étend la variable %i au nom du fichier uniquement - sans extension

Si vous voulez juste ajouter les dossiers pour un répertoire donné, la commande est un peu plus complexe car par défaut, FOR ne fonctionne qu'avec les fichiers. Nous devons lui fournir des informations supplémentaires :

POUR /F "usebackq delims=?" %i DANS (`DIR /B /A:D`) FAIRE 7z.exe a "%i.7z" "%i"

Cela fonctionne à cause de quelques éléments qui semblent être de la magie :

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

Si vous voulez encapsuler ceci dans un fichier batch, la seule modification que vous aurez besoin de faire est de doubler l'échappement de la variable %i :

POUR %%i DANS (*.*) FAIRE 7z.exe a "%%~ni.7z" "%%i"

21voto

jftuga Points 3037

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

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

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

Un avantage de Power Shell est que vous travaillez avec des objets au lieu de chaînes de caractères. Ainsi, vous pouvez être très spécifique 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. ont une extension csv
  2. sont inférieurs à 18 900 octets
  3. ont été modifiés le 1/7/2011 ou après

ÉDITER Si vous voulez des fichiers zip plutôt que des fichiers 7-zip, utilisez zip.exe d'InfoZip à la place.

0voto

Mxx Points 2763

Vous pouvez télécharger et installer le plugin 7zip pour Total Commander depuis http://www.ghisler.com/plugins.htm Une fois que vous avez fait cela, à droite 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 obtenir exactement ce que vous demandez.

0voto

Pi Hard Points 81

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

La réponse, par conséquent, est d'entrer 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 à ce répertoire pour traiter le dossier suivant.

Il est également important d'avoir 7ZIP ignorer 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 d'exclusion -x!*.zip et -x!*.cmd.

Ce script va également maintenir les structures de dossier récursives.

@echo off

REM Assure que les variables définies dans le fichier batch sont locales à
REM ce script uniquement et seront supprimées une fois terminées.
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 Remarque : pour que ce script fonctionne, la compression de
Echo fichiers zip préexistants n'est pas possible.

:end
pause

Le code ci-dessus devrait être copié dans un fichier batch 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 vous aidera.

0voto

sineas Points 251

Si vous avez besoin de conserver la structure des dossiers et de sauvegarder chaque fichier dans sa propre structure, essayez ceci :

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

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

Remarque :

-sdel : Supprime le fichier original (facultatif, si vous voulez seulement conserver le fichier compressé)

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