Compressez une archive sans inclure le répertoire parent


30

Je veux compresser de nombreux dossiers dans une arborescence de répertoires comme ça

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Lorsque j'essaie de le compresser, il termine la création d'une archive zip avec le dossier v au lieu du contenu (les sous-répertoires et les fichiers)

Comment puis-je éviter ça?

Réponses:


23

Donc, si je comprends bien, vous essayez d'archiver les fichiers et dossiers dans un dossier particulier mais sans inclure le dossier racine.

Exemple:

/test/test.txt
/test/test2.txt

où test.txt et test2.txt seraient stockés dans le zip, mais pas / test /

Vous pouvez cd dans le répertoire / test / puis exécuter quelque chose comme,

zip -r filename.zip ./*

Ce qui créerait une archive dans le même dossier nommé filename.zip. Ou si vous l'exécutez en dehors du dossier que vous pourriez exécuter,

zip -r test.zip test/*

Le / * est la partie qui inclut uniquement le contenu du dossier, au lieu du dossier entier.

Edit: OP voulait plusieurs zips, la solution a fini par être un peu un hack, je suis curieux de savoir s'il existe une meilleure façon de le faire.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

oui mais j'ai beaucoup de fichiers sur lesquels je fais la même chose donc ce serait fastidieux de le faire comme ça donc il y a comme un script bash ou quelque chose qui automatiserait le même processus sur le répertoire qui a tous les dossiers
— Dami

1
Ok, j'ai exécuté le script et il a créé un répertoire parent dans l'archive, je veux que le contenu du dossier soit dans l'archive
— Dami

1
mon erreur, j'en ai manqué un peu. ajouté un paramètre -j que je viens de rechercher, saute apparemment la partie que vous ne voulez pas. essayez ceci:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
— zzbomb

18
zip -r test.zip test / * de l'extérieur ajoute test en tant que répertoire dans le fichier zip
— smihael

4
comme @smihael l'a déclaré, zip -r test.zip test/*ne fonctionne pas. existe-t-il un moyen correct d'y parvenir depuis l'extérieur du répertoire?
— andrhamm

22

Utilisez l' option -jou --junk-pathsdans votre commande zip.

Depuis la page de manuel de zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Cela semble être la bonne réponse.
— mutant_city

3
Et les chemins / dossiers imbriqués?
— GuyPaddock

3
Cela omettra tous les dossiers de l'archive et si vous avez des noms de fichiers en double dans différents dossiers, cela explosera. Cela a sa place, mais seulement si vous ne vous souciez pas des dossiers et ne voulez que des fichiers. Pas ce que le PO demandait, mais toujours de bonnes connaissances
— Govind Rai

17

Et cette commande?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Bien que ce soit une bonne réponse, l'introduction ne semble pas vous convaincre vous-même. Il serait également utile d'expliquer un peu ce que fait la commande.
— Nephente

1
C'était aussi ma solution, mais je ne l'aime pas parce qu'elle implique cd. J'espérais qu'il y avait un moyen de spécifier plus précisément le chemin stocké.
— nilskp

3

J'espère que cela t'aides.

(cd directory && zip -r ../out.zip .)

Il garde le shell principal dans le même répertoire et ne change que le répertoire du sous-shell qui meurt après la commande.


Je voulais ajouter ceci en tant que commentaire à la réponse de @Alfred UC , mais je n'ai pas assez de réputation pour cela.
— Kenneth

Si cela résout le problème, cela peut être une solution.
— Yufenyuy Veyeh Dider

C'est mieux comme réponse. Est-ce que cela fonctionne à la fois dans bash et sh?
— Arlen Beiler
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.