195 votes

Répertoire zip Unix mais excluant 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 qu'ils contiennent).

Pour l'instant, j'ai ceci :

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

Mais ça ne semble pas fonctionner.

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 des sous-répertoires dans les répertoires que je veux exclure est assez importante et je ne peux pas simplement ajouter chaque répertoire à l'argument -x.

Quelqu'un sait-il comment faire ?

0 votes

@AlexanderMills - Voir cette question.

210voto

user881480 Points 139

J'étais si proche !

La commande dont j'ai besoin est la suivante :

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

3 votes

Cela n'a pas fonctionné pour moi sur osx. La réponse de @pathfilder a fonctionné.

31 votes

Au lieu de cela : -x dir1/ignoreDir1/**\*, vous pouvez faire ceci : -x dir1/ignoreDir1/\*

2 votes

Ceci a fonctionné pour moi zip -r theme.zip ./theme -x ./theme/node_modules/\*

133voto

pathfinder Points 1331

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

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

Notas:

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

-- Vous devez utiliser le chemin complet des répertoires que vous voulez exclure !

13 votes

C'est celui qui fonctionne sur Mac OS :-)

24 votes

Comme personne n'a expliqué la raison pour laquelle il est nécessaire de citer les chemins ou d'échapper à l'astérisque, la raison est la suivante : Si le chemin n'est pas cité ou si le joker n'est pas échappé, le Shell effectuera l'expansion du joker. 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 ces répertoires, ce qui entraînera la création de zip pour ne pas ignorer tout ce qui se trouve sous les répertoires donnés.

0 votes

Je pense qu'à l'origine, l'une des raisons pour lesquelles cela fonctionnait était que, sous Mac OS, il y avait des espaces dans mes répertoires et que cela évitait d'avoir besoin d'un "\".

13voto

Gianluca P. Points 221

@sulman en utilisant :

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

inclura toujours le dossier vide dir1/ignoreDir1/ dans l'archive zip, en utilisant :

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

fera l'affaire, vous pouvez aussi utiliser un ** en tête pour rechercher dans les sous-dossiers au lieu de seulement dir1

0 votes

Ah ok ! Merci de m'avoir éclairé sur ce point !

9voto

ericn Points 221

Les éléments suivants feront l'affaire

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

De quoi avez-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%)

0 votes

Je ne sais pas pourquoi le ** est nécessaire. Peut-être quelqu'un d'autre peut-il m'éclairer sur ce point ?

0 votes

Désolé, @sulman, j'ai mal tapé. Ce que je voulais dire est conforme à ma dernière modification. Cela fonctionne comme un charme pour moi :)

2voto

Comme les 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/\*

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X