286 votes

Comment puis-je créer une archive zip de tout un répertoire via le terminal sans les fichiers cachés ?

J'ai un projet avec beaucoup de dossiers / fichiers cachés. Je veux en créer une archive zip, mais dans l'archive, il ne devrait pas y avoir de dossiers / fichiers cachés. Si les fichiers dans un dossier caché ne sont pas cachés, ils ne doivent pas non plus être inclus.

Je sais que je peux créer une archive zip d'un répertoire de cette manière :

zip -r zipfile.zip directory

Je sais aussi que je peux exclure des fichiers avec l'option -x, donc j'ai pensé que cela pourrait fonctionner :

zip -r zipfile.zip directory -x .*

Ça n'a pas marché. Tous les dossiers cachés étaient toujours dans le fichier zip.

182voto

M.A.K. Ripon Points 2699

Tout d'abord, si vous n'avez pas installé zip, installez-le d'abord comme suit :

sudo apt-get install zip

Ensuite, pour simplement créer un fichier zip :

zip -r nom_fichier_compresse.zip nom_dossier

Si vous voulez exclure les fichiers cachés :

find /chemin_du_dossier -path '*/.*' -prune -o -type f -print | zip ~/nom_fichier_compresse.zip -@

Exclure des fichiers d'une archive zip (tiré de http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/)

Les bases de l'exclusion de fichiers lors de la création d'une archive zip sont centrées autour du drapeau -x, qui est utilisé pour exclure des fichiers de l'archive qui correspondent à un nom ou à un motif spécifique. À son niveau le plus fondamental, cela ressemblera à ceci :

zip archive.zip fichiers -x "ExclureMoi"

Cela signifie que vous pourriez exclure un seul fichier, disons qu'il s'appelle "JeNesaispas.jpg"

zip archive.zip images/ -x "JeNesaispas.jpg"

Explorons maintenant quelques exemples spécifiques où cela est utile.

Exclure les fichiers .DS_Store des archives Zip

Cela empêchera les fichiers de métadonnées Mac invisibles habituellement .DS_Store d'être inclus dans une archive zip, qui sont inclus par défaut :

zip -r nom_archive.zip dossier_archive -x "*.DS_Store"

Si le répertoire inclut toutefois des sous-répertoires, vous voudrez utiliser une autre variation de cette commande pour exclure aussi les fichiers ds_store des sous-répertoires :

zip -r archive.zip répertoire -x "*/\.DS_Store"

Remarque : toutes les consoles ne nécessitent pas les guillemets pour que cette commande fonctionne correctement, mais dans la console bash (par défaut pour OS X), vous devrez utiliser les guillemets pour exclure avec des jokers et des motifs.

Exclure des types de fichiers spécifiques d'une archive Zip

Avec des jokers, vous pouvez également exclure tous les fichiers d'un certain type en se concentrant sur l'extension. Par exemple, cette commande zippera un répertoire entier, à l'exception des fichiers .jpg :

zip -r archive.zip répertoire -x "*.jpg"

Cela pourrait être modifié pour n'importe quelle extension de fichier spécifique ou motif correspondant dans un nom de fichier.

Exclure le répertoire .git ou .svn d'une archive zip

Zipper un répertoire, à l'exclusion de .git et de ses contenus :

zip -r zipdir.zip répertoire_zip -x "*.git*"

Zipper un dossier, sans inclure le répertoire .svn :

zip -r zippé.zip répertoire -x "*.svn*"

Exclure tous les fichiers cachés d'une archive zip

Comme des motifs et des jokers peuvent être utilisés, vous pourriez également exclure tout fichier ou dossier invisible qui est rendu tel en étant préfixé d'un point, que ce soit un répertoire comme .svn ou un fichier individuel comme .bash_profile ou .htaccess.

zip -r nom_archive.zip dossier_zip -x "*.*"

Ou pour exclure tous les fichiers invisibles de tous les sous-répertoires :

zip -r archive.zip répertoire -x "*/\.*"

123voto

DublinJimbo Points 314

Cela exclut également les fichiers cachés dans les répertoires non cachés:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@

60voto

Rinzwind Points 270388

Ajoutez " au .* (sinon, votre shell étend .* aux fichiers point dans le répertoire actuel), et excluez également les fichiers cachés dans les sous-répertoires :

zip -r zipfile.zip . -x ".*" -x "*/.*"

Cela permettra aux fichiers commençant par un . de ne pas être ajoutés à votre fichier zip.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
ajout: .tmp/ (stocké 0%)
ajout: tmp/ (stocké 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
mise à jour: tmp/ (stocké 0%)

10voto

Tigrouzen Points 99

Exemple pour exclure tous les dossiers commençant par . :

tar cvpzf folder.tgz folder/ --exclude '.*'

Meilleure compression mais plus lente :

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

9voto

cosimnot Points 91

Celui-ci inclut tous les répertoires ".", sous-répertoires et fichiers ou répertoires "." à l'intérieur des répertoires... Essentiellement la première réponse mais inclut les fichiers "." de niveau supérieur.

find /chemin_complet -path '*.*/.*' -prune -o -type f -print | zip ~/fichier.zip -@

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