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


J'essaie de compresser un répertoire (sous Unix via SSH) mais je dois exclure quelques sous-répertoires (et tous les fichiers et répertoires qui s'y trouvent).

Jusqu'à présent, j'ai ceci:

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

Cela ne semble pas marcher bien.

J'ai aussi essayé

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

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

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

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


81
2017-07-19 10:19


origine


@AlexanderMills - Voir cette question. - jww


Réponses:


J'étais si près!

La commande dont j'ai besoin est:

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

86
2017-07-19 10:32



Cool, et merci pour le suivi! Au fait, vous pouvez accepter votre propre réponse. - Daniel H
Juste ce que je cherchais, merci mec! - Latheesan
Cela n'a pas fonctionné pour moi sur osx. La réponse de @pathfilder a cependant fait. - rynop
Au lieu de cela: -x dir1 / ignoreDir1 / ** \ *, vous pouvez faire ceci: -x dir1 / ignoreDir1 / \ * - Richard Gomes


Pour mon système particulier afin d'exclure un répertoire, j'ai dû mettre des citations autour de mes répertoires exclus et cela a fonctionné comme un charme:

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

Remarques:

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

- Vous devez utiliser le chemin complet vers les répertoires que vous souhaitez exclure!


55
2017-10-31 11:43



C'est celui qui fonctionne sous Mac OS. :-) - physicalattraction
Comme personne n'a expliqué la raison pour laquelle il fallait soit citer les chemins, soit échapper à l'astérisque, la raison est la suivante: si le chemin n'est pas entre guillemets ou si le caractère générique s'est échappé, le shell effectue une extension générique. avant les transmettre à zip, qui recevra une liste de 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, provoquant ainsi zip de ne pas tout ignorer sous les répertoires donnés. - zagrimsan
Je pense qu'au départ l'une des raisons pour lesquelles cela a fonctionné était parce que sur Mac OS, il y avait des espaces dans mes répertoires et cela évitait d'avoir besoin d'un \ - pathfinder


Ce qui suit fera

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

De quoi aviez-vous besoin ** 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%)

6
2017-09-17 05:00



Je ne sais pas pourquoi le ** est nécessaire. Peut-être quelqu'un d'autre peut-il nous éclairer? - sulman
Désolé, @sulman, j'ai mal tapé. Ce que je voulais dire est selon ma dernière édition. Fonctionne comme un charme pour moi :) - ericn


@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 ** leader pour rechercher dans les sous-dossiers au lieu de dir1 seulement


4
2017-10-30 11:31



Ah ok! Merci d'avoir éclairé cela! - sulman


Tout comme les autres réponses, mais à l'exclusion des répertoires, au lieu d'exclure tout le contenu des répertoires:

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

1
2018-01-22 14:39





J'ai trouvé ça pour travailler David R Heffelfinger:

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

Il a exclu le répertoire et son contenu.


0
2017-10-03 18:28



Sûrement le backslash entre dir1 et ignorDir2 est destiné à être une barre oblique. Voulez-vous dire que les autres antislashs sont des antislashs? Si vous le faites, alors vous venez de copier la réponse de fuzzybee il y a deux ans. - G-Man


Pour moi a travaillé:  zip -9 -r ~ / folded.zip en ligne -x dossier / folder2 / folder3 / foldern /\ *.

Semble que l'astérisque doit être échappé.


-1
2017-12-01 13:29



En quoi cela diffère-t-il de la solution de Rick Ehrahrt il y a un an ou celle d'Eric (il y a quelques années)? S'il vous plaît lisez les solutions fournies avant de poster un nouveau ... - zagrimsan
Parce que j'ai ajouté une barre oblique inverse avant l'astérisque (c'est-à-dire pour échapper à l'astérisque). Dans la version Linux, mon travail ne fonctionne pas si je ne le fais pas. - Francisco M
Aussi Rick Ehrahrt (2014) et eric (2012) ont affiché la même solution (pour échapper à l'astérisque). Il n'y a rien de mal avec la solution, mais poster plusieurs fois la même chose n'a de sens que si l'on peut ajouter de la profondeur à la solution en expliquant pourquoi la solution fonctionne. Dans un cas simple comme celui-ci, il n'y a rien à expliquer davantage. S'il vous plaît ne prenez pas cela personnellement, ma seule intention ici est d'aider à garder SU propre et concis afin que les utilisateurs puissent trouver la meilleure solution avec le moins d'effort. - zagrimsan