Répertoire zip Unix, mais sous-répertoires spécifiques exclus (et tout ce qu’ils contiennent)

115

J'essaie de compresser un répertoire (sous Unix via SSH), mais je dois exclure quelques sous-répertoires (ainsi que tous les fichiers et répertoires qu'ils contiennent).

Jusqu'ici j'ai ceci:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Cela ne semble pas fonctionner cependant.

J'ai aussi essayé

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

Cependant, cela inclura toujours des sous-répertoires dans ignoreDir1 et ignoreDir2.

La structure des sous-répertoires dans les répertoires que je souhaite exclure est assez importante, aussi je ne peux pas simplement ajouter chaque répertoire à l'argument -x.

Est-ce que quelqu'un sait comment faire ça?

Sulman
la source
@AlexanderMills - Voir cette question.
jww

Réponses:

131

J'étais si près!

La commande dont j'ai besoin est:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
Sulman
la source
Cool, et merci pour le suivi! Vous pouvez accepter votre propre réponse, au fait.
Daniel H
2
Cela n'a pas fonctionné pour moi sur osx. La réponse de @pathfilder l'a cependant été.
Rynop
11
Au lieu de ceci: -x dir1 / ignoreDir1 / ** \ *, vous pouvez le faire: -x dir1 / ignoreDir1 / \ *
Richard Gomes
67

Pour mon système particulier, afin d'exclure un répertoire, je devais mettre des guillemets autour de mes répertoires exclus et cela fonctionnait à merveille:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Remarques:

- cela exclut à la fois le répertoire à exclure et tous les fichiers qu'il contient.

- Vous devez utiliser le chemin d'accès complet aux répertoires que vous souhaitez exclure!

éclaireur
la source
5
C'est celui qui fonctionne sur Mac OS. :-)
physicalattraction
9
Comme personne n’a expliqué la raison pour laquelle il était nécessaire de citer les chemins ou d’éviter l’astérisque, la raison est la suivante: si le chemin n’est pas cité ou si le caractère générique est échappé, le shell procédera à une expansion du caractère générique avant de le transmettre zip, qui recevra une liste de Les chemins d'accès aux entrées dans les répertoires spécifiés, mais pas les chemins d'accès aux fichiers dans les sous-répertoires de ceux-ci, entraînant ainsi zipde ne pas tout ignorer sous les répertoires donnés.
zagrimsan
Je pense qu’à l’origine, cela fonctionnait parce que, sous Mac OS, il y avait des espaces dans mes répertoires et que cela évitait la nécessité d \
pathfinder
Merci d'avoir éclairci les choses @zagrimsan. Cela a résolu le problème et en a expliqué la raison pour que nous le comprenions (ce qui sera également utile à l'avenir pour d'autres choses). 👍
Synetech
8

@sulman utilisant:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 / ** \ * dir1 / ignoreDir2 / ** \ *

inclura toujours le dossier dir1 / ignoreDir1 / empty dans l’archive zip, en utilisant:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 ** dir1 / ignoreDir2 **

fera l'affaire, vous pouvez également utiliser un ** principal pour rechercher dans les sous-dossiers au lieu de seulement dir1

Gianluca P.
la source
Ah ok! Merci d'avoir apporté la lumière à ce sujet!
Sulman
7

Ce qui suit fera

zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 \ * dir1 / ignoreDir2 \ *

Qu'est-ce que tu avais besoin de **pour, Sulman?

Cela fonctionne comme un charme pour moi comme suit:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)
Eric
la source
Je ne sais pas pourquoi le ** est nécessaire. Peut-être que quelqu'un d'autre peut nous éclairer?
Sulman
Désolé, @sulman, j'ai mal tapé. Ce que je voulais dire est comme par mon dernier montage. Fonctionne comme un charme pour moi :)
ericn
1

Tout comme d’autres réponses, mais en excluant entièrement les répertoires, au lieu d’exclure tout le contenu des répertoires:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Richard Gomes
la source
0

J'ai trouvé cela fonctionner de David R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Cela excluait le répertoire et son contenu.

Rick Ehrahrt
la source
La barre oblique inverse entre dir1et ignorDir2est censée être une barre oblique. Voulez-vous dire que les autres barres obliques inverses sont des barres obliques inverses? Si vous le faites, vous venez de copier la réponse de fuzzybee d'il y a deux ans.
G-Man
-1

Pour moi a fonctionné: zip -9 -r ~ / folded.zip en ligne -x dossier / dossier2 / dossier3 / foldern / \ * .

On dirait que l'astérisque doit être échappé.

Francisco M
la source
2
En quoi cela diffère-t-il de la solution de Rick Ehrahrt d'il y a un an ou d'Eric (il y a quelques années de plus)? Veuillez lire les solutions fournies avant d’en publier une nouvelle ...
zagrimsan
Parce que j'ai ajouté une barre oblique inverse avant l'astérisque (c'est pour échapper à l'astérisque). Dans la version Linux, mon travail ne fonctionne pas si je ne le fais pas.
Francisco M
Rick Ehrahrt (2014) et Eric (2012) ont également affiché la même solution (pour échapper à l'astérisque). Il n'y a rien de mal à la solution, mais publier le même plusieurs fois n'a de sens que si l'on peut ajouter de la profondeur à la solution en expliquant pourquoi cette solution fonctionne. Dans un cas simple comme celui-ci, il n'y a rien à expliquer de plus. Veuillez ne pas prendre cela personnellement, mon seul but ici est d'aider à garder le SU propre et concis afin que les utilisateurs puissent trouver la meilleure solution avec le moins d'effort possible.
zagrimsan