Comment archiver avec des sous-répertoires à l'aide de la ligne de commande 7-Zip? Ou, comment CONSERVER la structure des dossiers pendant l'archivage?

16

J'ai un tas de fichiers comme celui-ci:

C:\G\G1\35antique-shop.mp3
C:\G\G2\35antique-shop.mp3
C:\G\G1\09saguri.mp3
C:\G\G2\09saguri.mp3

Je veux juste savoir comment conserver la structure des dossiers lors de l'archivage. C'est plus important que la chose en double, savoir comment résoudre cela, serait un bonus.

@Lamb "Souhaitez-vous archiver uniquement des fichiers sélectifs (pas tout le contenu du dossier) des dossiers G1 et G2?"

Cela dit presque tout, mais je vais essayer de m'améliorer: Non seulement je veux déplacer uniquement certains fichiers sélectionnés vers une archive. J'ai également une liste de ces fichiers, y compris les noms de chemin d'accès à chaque fichier.

Ainsi, dans SubDir1, il peut y avoir 10 fichiers, dont je veux en compresser trois, et dans SubDir1 \ sub2, il peut y avoir cinq fichiers, dont je veux compresser les cinq. Les fichiers que j'ai besoin d'archiver sont dans un fichier de liste.

Il peut y avoir des fichiers en double, donc j'espère qu'avec les sous-répertoires ajoutés, 7-Zip ne les voit PAS comme des doublons.

Et j'aime le faire sur la ligne de commande.

J'ai essayé un fichier batch comme celui-ci:

7z a -r MyArchive.7z C:\G\G1\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G2\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G1\09saguri.mp3
7z a -r MyArchive.7z C:\G\G2\09saguri.mp3

Cela signifie également que les fichiers 01antique-shop.mp3, 02antique-shop.mp3, ...., jusqu'à 33antique-shop.mp3 et 34antique-shop.mp3, NE doivent PAS être archivés.

Les noms de dossier (= sous-répertoires) n'ont pas été ajoutés à MyArchive.7z, et c'est le problème.

Évidemment, j'aimerais utiliser un seul commando avec un fichier de liste, mais cela ne fonctionne pas non plus.

J'ai essayé:

7z a -mx0 -tzip C:\$$-edrive\F-G-H.zip @fgh.txt

ce qui fonctionne très bien en ce qui concerne la sélection, mais il ne conserve PAS la structure du répertoire. Tristement.

Comment puis-je faire cela?

PrincessPooleRulz
la source
Souhaitez-vous archiver uniquement des fichiers sélectifs (pas tout le contenu du dossier) des dossiers G1 et G2?
Ankit

Réponses:

12

La dernière version stable de 7-Zip (15.14) a le commutateur -spf qui permet le stockage de chemin absolu.

Par exemple, si le fichier list.txt est

C:\tmp\dir1\file.txt
C:\tmp\dir2\file.txt

la commande 7z a p.7z -spf @list.txtproduira une archive stockant les chemins absolus tels quels dans la liste. Alternativement, la commande 7z a p.7z -spf2 @list.txtsupprimera la lettre de lecteur:

tmp\dir1\file.txt
tmp\dir2\file.txt

Si le fichier list.txt est

dir1\file.txt
dir2\file.txt

la commande 7z a p.7z @list.txtstockera les chemins relatifs tels quels dans la liste, dans les deux versions 9.20 et 15.14.

J'ai fait plus de tests avec le commutateur -spf. Les résultats sont ici .

Marco
la source
J'ai cherché cette idée pendant une journée. Merci !
Moshe L
9

Je l'ai obtenu pour archiver un répertoire avec des sous-répertoires en utilisant ce qui suit :

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Eric Roper
la source
Je ne trouve aucun lien direct vers le 7zA.exe (selon votre lien), est-il obsolète et remplacé par 7z.exe?
PrincessPooleRulz
@ user194767: 7za.exe est la version en ligne de commande .
Karan
et, je voudrais l'utiliser, mais je ne trouve pas de semblable sur cette page, 7-zip.org/download.html. Donc, pour être clair: avec " je ne trouve pas de lien direct vers le 7zA.exe n'importe où", je voulais vraiment dire: "S'il vous plaît, donnez-moi un lien direct vers ce logiciel gratuit!" Je vous remercie!
PrincessPooleRulz
1
@ user194767: Ok, voici la version actuelle, mais me dites-vous que vous ne pouviez pas repérer la version de ligne de commande 7-Zip n'importe où sur cette page?!
Karan
Je ne pouvais pas 7zA.exe alors j'ai essayé d'utiliser 7z.exe et cela a fonctionné. Je ne sais pas à quoi sert l'indicateur -r mais il n'est pas nécessaire pour archiver les sous-répertoires.
Eric Roper
7

Essayez plutôt ceci:

cd /d C:\
7z a MyArchive.7z G\G1\35antique-shop.mp3
7z a MyArchive.7z G\G2\35antique-shop.mp3
7z a MyArchive.7z G\G1\09saguri.mp3
7z a MyArchive.7z G\G2\09saguri.mp3

Le problème semble être que les gens demandent depuis des années des options de stockage de chemin appropriées (tout comme ils ont la possibilité de modifier des archives multi-volumes ), mais l'auteur ne semble pas intéressé. C'est en partie la raison pour laquelle j'ai commencé à utiliser WinRAR autant.


Si vous avez un fichier liste, 7-Zip ne stockera pas les chemins si les fichiers à archiver ne partagent pas un seul répertoire de niveau supérieur. Par exemple, si vous avez Input.txt contenant les éléments suivants:

C:\path to\file1.ext
D:\path to\file1.ext
E:\path to\file1.ext

Si vous exécutez 7z a MyArchive.7z @Input.txt, vous verrez que les chemins ont été complètement supprimés, ce qui me semble complètement à l'envers (OTOH rar a MyArchive.rar @Input.txtfait très bien le travail).

Donc, pour surmonter la carence de 7-Zip, vous pouvez utiliser un fichier batch comme suit:

for /f "tokens=1* delims=\" %%i in (Input.txt) do (
    pushd %%i\
    7z a D:\MyArchive.7z "%%j"
    popd
)

Remarque: remplacez-le D:\MyArchive.7zpar le chemin d'accès approprié à votre archive de destination. En outre, le fichier de commandes doit fonctionner, que vous ayez cité ou non des chemins dans votre fichier de liste.


Modifier: si votre fichier de liste ressemble à:

"C:\$$-edrive\F\faithless.-.long.way.mp3"
"C:\$$-edrive\G\Antique Shop.mp3"

ou

"\$$-edrive\F\faithless.-.long.way.mp3"
"\$$-edrive\G\Antique Shop.mp3"

puis modifiez-le pour qu'il ressemble à ceci:

"$$-edrive\F\faithless.-.long.way.mp3"
"$$-edrive\G\Antique Shop.mp3"

En supposant maintenant que tous les fichiers à archiver sont sous C:\$$-edrive, accédez à C: \ et exécutez 7z a C:\MyArchive.7z @C:\Input.txt. À l'aide d'un fichier de liste, les chemins d'accès ne seront enregistrés que si aucune lettre de lecteur n'est présente, aucune barre oblique inverse initiale n'est là et si le répertoire de niveau supérieur (racine) est le même pour tous les fichiers. Aussi, pour de meilleurs résultats, je vous conseille de ne pas créer MyArchive.7z dans C: \ $$ - edrive.

Karan
la source
Eh bien, la réponse était 3/4 ok. RAR fonctionnait super bien, mais le fichier batch fonctionnait soso. Voici la sortie, et il n'a ajouté qu'un seul fichier à mes archives, celui sans espaces dans le nom de fichier___ C: \ Programs \ zippers \ 7-Zip> (pushd "C: \ c: \ Programs \ zippers \ 7-Zip \ 7z .exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ G \ gattaca_7mp 3_zefen \ gattaca - 03 le popd one moment.mp3" ") 7-Zip 4.65 Copyright (c) 1999-2009 Igor Pavlov 2009 Analyse de la mise à jour de l'archive c: \ $$ - edrive \ FGH.7z Erreur: impossible d'ouvrir le fichier FGH.7z.tmp Accès refusé. Erreur système: erreur non définie ===== Le plus important est peut-être l'erreur d'accès refusé?
PrincessPooleRulz
Pouvez-vous ajouter quelques exemples de lignes (avec et sans espaces) de votre fichier de liste réel à votre question ci-dessus?
Karan
d'accord, j'ai donc remplacé tous les espaces par des points dans les noms de fichiers, mais pas dans les chemins d'accès, que je vais essayer maintenant. la sortie est toujours: C: \ Programs \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programs \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Analyse Mise à jour des archives c: \ $$ - edrive \ FGH.7z Erreur: impossible d'ouvrir le fichier FGH.7z.tmp Accès refusée. Erreur système: erreur non définie
PrincessPooleRulz
"J'ai remplacé tous les espaces par des points dans les noms de fichiers" - ce qui signifie que vous avez renommé les fichiers réels ou simplement modifié le fichier de liste? Les espaces dans les noms de fichiers et les chemins devraient être corrects, voir ma modification ci-dessus (c'est-à-dire de votre fichier de liste, supprimez C: \ et placez des guillemets autour de tous les chemins). Vous devriez maintenant pouvoir utiliser 7z directement au lieu de ma solution de contournement de fichier batch.
Karan
1. J'ai renommé les deux = = = = = = = 2. J'ai effectué vos modifications, mais cela ne fonctionne toujours pas avec 7z = = = = = = 3. $$ - edrive \ est en effet le seul répertoire supérieur. = = = = = 4. Messages d'erreur = = = = = AVERTISSEMENTS pour les fichiers: = = = = = $$ - edrive: le système ne peut pas trouver ce fichier. = = = = = = = = = = "$$ - edrive: Le système ne peut pas trouver ce fichier. = = = = = = = = = = AVERTISSEMENT: Impossible de trouver 2 fichiers = = = = = = C: \ Programmes \ zippers \ 7-Zip> = = = = = notez qu'il y a deux avertissements, et le second commence par une double citation ... Odd?
PrincessPooleRulz
0

7-Zip les verra comme des doublons et les ignorera. S'il y a un moyen de contourner cela, je ne l'ai jamais trouvé - je décompose toujours le travail en plusieurs archives.

MT_Head
la source
savez-vous comment conserver la structure des dossiers tout en zippant des fichiers dans une archive? Ils disent que c'est la valeur par défaut, mais ce n'est PAS.
PrincessPooleRulz
@ user194767 - J'utilise une ligne de commande comme celle-ci: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\tempZDIRest le chemin vers 7-Zip et ZIPest le lecteur de destination.
MT_Head
0

Je ne sais pas comment aider avec les doublons. Cependant, je pense qu'un système plus pratique qu'un batch avec une commande complète par serait de créer un listfile.txt:

 C:\G\G1\35antique-shop.mp3
 C:\G\G2\35antique-shop.mp3
 MyArchive.7z C:\G\G1\09saguri.mp3
 MyArchive.7z C:\G\G2\09saguri.mp3

Et puis compressez-les tous avec 7z a -r -tzip archive.zip @listfile.txt

Cosinus
la source
0

J'ai créé un script bat à utiliser avec totalcmd "tot-zip.bat":

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "TOP_DIR="D:\Grabovsky""
set "archname="%TOP_DIR%\arch.zip""
set "filelist= "
cd %TOP_DIR%
for %%A in (%*) do (
    set ondisk_path="%%~dpnxA"
    set inarch_path=!ondisk_path:%TOP_DIR%\=!
    echo Putting !ondisk_path! to !inarch_path!.
    set "filelist=!filelist! !inarch_path!"
)
echo filelist: %filelist%

7z.exe a -tzip %archname% %filelist% > NUL
pause

Ensuite, dans totalcmd, créez un raccourci: entrez la description de l'image ici

Ensuite, lorsque vous souhaitez compresser certains fichiers / dossiers et conserver la structure des dossiers par rapport à %TOP_DIR%vous, sélectionnez simplement les fichiers nécessaires (quelque part à l'intérieur %TOP_DIR%) et appuyez sur le bouton.

grabantot
la source