web-dev-qa-db-fra.com

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

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. Ceci est plus important que la duplication, savoir comment résoudre ce problème serait un bonus.

@Lamb "Voulez-vous archiver uniquement des fichiers sélectionnés (pas le contenu du dossier en entier) des dossiers G1 et G2?"

Cela dit presque tout, mais je vais essayer d’améliorer: Non seulement je veux déplacer que certains fichiers sélectionnés dans une archive. J'ai aussi 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 compresser trois, et dans SubDir1\sub2, il peut y en avoir cinq, dont je souhaite compresser les cinq. Les fichiers que je dois archiver sont dans un listfile.

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

Et j'aime le faire en ligne de commande.

J'ai essayé un fichier de commandes comme ceci:

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 réellement assez bien en ce qui concerne la sélection, mais il ne conserve PAS la structure de répertoires. Malheureusement.

Comment puis-je faire cela?

12
PrincessPooleRulz

La dernière version stable de 7-Zip (15.14) possède le commutateur -spf qui active le stockage sur 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.txt produira une archive stockant les chemins absolus tels quels dans la liste. Sinon, la commande 7z a p.7z -spf2 @list.txt supprimera 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.txt stockera 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 .

10
Marco

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

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
9
Eric Roper

Essayez ceci à la place:

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 ans des options de stockage de chemin correctes (comme ils le font pour la possibilité de modifier des archives multi-volumes ), mais l'auteur ne semble pas être intéressé. C'est en partie pourquoi j'ai tellement commencé à utiliser WinRAR.


Si vous avez un fichier de liste, 7-Zip ne stockera pas les chemins d'accès 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 constaterez que les chemins ont été entièrement supprimés, ce qui me semble complètement en arrière (OTOH rar a MyArchive.rar @Input.txt fait très bien l'affaire).

Donc, pour remédier à la déficience de 7-Zip, vous pouvez utiliser un fichier de commandes comme suit:

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

Remarque: Remplacez D:\MyArchive.7z par le chemin correct vers votre archive de destination. En outre, le fichier de commandes doit fonctionner, que vous ayez ou non cité des chemins dans votre fichier liste.


Edit: Si votre fichier liste ressemble à ceci:

"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 éditez-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. En utilisant un fichier de liste, les chemins seront sauvegardés seulement si aucune lettre de lecteur n'est présente, il n'y a pas de barre oblique inverse initiale et si le répertoire de niveau supérieur (racine) est le même pour tous les fichiers. De plus, pour obtenir de meilleurs résultats, je vous déconseille de créer MyArchive.7z dans C:\$$ - edrive.

7
Karan

Vous ne savez pas comment vous aider avec les doublons. Cependant, je pense qu'un système plus pratique qu'un lot avec une commande complète serait de créer un fichier 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

0
Cosine

J'ai créé un script de batte à 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 pour cela: enter image description here

Ensuite, lorsque vous voulez compresser des fichiers/dossiers en conservant la structure de dossiers relative à %TOP_DIR%, vous devez simplement sélectionner les fichiers nécessaires (quelque part dans %TOP_DIR%) et appuyer sur le bouton.

0
grabantot

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 divise toujours le travail en plusieurs archives.

0
MT_Head