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?

Dami
la source

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;
zzbomb
la source
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).
robrtsql
la source
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 ..
aluc
la source
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.

Kenneth
la source
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