Comment créer une archive zip de tout un répertoire via un terminal sans fichiers cachés?

220

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

Je sais que je peux créer une archive zip d'un répertoire comme celui-ci:

zip -r zipfile.zip directory

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

zip -r zipfile.zip directory -x .*

Ça n'a pas marché. Tous les répertoires cachés étaient encore dans le fichier zip.

Martin Thoma
la source

Réponses:

107

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

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
organiser
la source
2
Merci pour votre réponse. La commande ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) est plus longue que prévu, mais cela fonctionne bien. Les sous-répertoires sont également inclus, donc +1 et une réponse acceptée :-)
Martin Thoma Le
105

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

sudo apt-get install zip

Ensuite, pour créer simplement un fichier zip:

zip -r compressed_filename.zip foldername

Si vous souhaitez exclure des fichiers cachés:

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

Exclusion de fichiers d'une archive Zip (extrait de http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Les bases de l'exclusion de fichier lors de la création d'une archive zip sont centrées autour de l' -xindicateur, utilisé pour exclure les fichiers de l'archive qui correspondent à un nom ou à un modèle spécifique. Au plus basique, cela ressemblera à ceci:

zip archive.zip files -x "ExcludeMe"

Cela signifie que vous pouvez exclure un seul fichier, disons qu'il s'appelle «Nothanks.jpg».

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

Couvrons quelques exemples spécifiques où cela est utile.

Exclure les fichiers .DS_Store des archives Zip

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

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Cependant, si le répertoire comprend des sous-répertoires, vous voudrez utiliser une autre variante de cette commande pour exclure les fichiers ds_store des sous-répertoires:

zip -r archive.zip directory -x "*/\.DS_Store"

Remarque: tous les shells n'ont pas besoin des guillemets pour que cette commande fonctionne correctement, mais dans le shell bash (par défaut pour OS X), vous devrez utiliser les guillemets pour les exclure avec des caractères génériques et des modèles.

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

Avec les caractères génériques, vous pouvez également exclure tous les fichiers d’un certain type en vous concentrant sur l’extension. Par exemple, cette commande compressera un répertoire entier, moins les .jpgfichiers:

zip -r archive.zip directory -x "*.jpg"

Cela pourrait être modifié pour toute extension de fichier ou motif spécifique correspondant à un nom de fichier.

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

Zip un répertoire, moins .gitet son contenu:

zip -r zipdir.zip directorytozip -x "*.git*"

Zip un dossier, sans inclure le .svnrépertoire:

zip -r zipped.zip directory -x "*.svn*"

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

Étant donné que des modèles et des caractères génériques peuvent être utilisés, vous pouvez également exclure tout ou partie des fichiers et dossiers invisibles créés en préfixant un point, qu'il s'agisse d'un répertoire similaire .svnou d'un fichier individuel similaire à .bash_profileou .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

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

zip -r archive.zip directory -x "*/\.*"
MAK Ripon
la source
5
Merci pour vos efforts pour aider un autre utilisateur d’Ubuntu. Veuillez garder à l'esprit que répéter la réponse acceptée dans une nouvelle réponse ne fait qu'ajouter à l'encombrement et risque fortement d'être annulé.
hmayag
54

Ajoutez "à la .*(sinon, votre shell se développe .*pour les fichiers de points dans le répertoire en cours), et exclut également les fichiers cachés dans les sous-répertoires:

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

Cela entraînera des fichiers commençant par un .ne devant pas être ajouté à 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 .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)
Rinzwind
la source
1
Je ne pense pas que votre dernière déclaration est correcte. .*serait élargi par la coquille.
hammar
1
Je pense que c'est probablement correct mais je l'ai enlevé (pas sûr de ça) :)
Rinzwind
cela n'a pas fonctionné. Les répertoires .svn ont été ajoutés
Martin Thoma
1
@moose Le modèle d'exclusion correspond au chemin d'accès complet, pas seulement au nom de base du fichier, vous devez donc exclure */.*aussi bien que .*( */correspond à toute séquence de répertoires non vide).
Gilles
Cela fonctionne sans rien changer! Meilleure réponse.
Whitecat
8

Celui-ci comprend tout "." répertoires, sous-répertoires et "." fichiers ou répertoires dans des répertoires ... Essentiellement, la première réponse, mais inclut le niveau supérieur "." des dossiers.

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

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

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

Mieux compresse mais plus lent:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'
Tigrouzen
la source
5

La bonne méthode serait:

zip -r zipfile.zip directory -x directory/.*
Rômulo Neves
la source
@ downvoter: Qu'est-ce qui ne va pas, cela semble fonctionner pour moi.
jobin
Même problème que pour la réponse originale de Rinzwind (maintenant corrigée): vous n'excluez pas les sous-répertoires. Et comme Rinzwind l’a noté, vous devez citer les caractères génériques, sinon le shell les développera.
Gilles
4

En zippant les répertoires en excluant une extension de fichier:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"
K-Gun
la source
3

Sans dossiers et fichiers cachés dans le répertoire:

zip -r zipfile.zip directory/*

annuaire: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Umanshield
la source