¿Cómo puedo crear un archivo zip de un directorio completo a través de la terminal sin archivos ocultos?

220

Tengo un proyecto con muchas carpetas / archivos ocultos. Quiero crear un archivo zip, pero en el archivo no debería haber carpetas / archivos ocultos. Si los archivos en una carpeta oculta no están ocultos, tampoco deberían incluirse.

Sé que puedo crear un archivo zip de un directorio como este:

zip -r zipfile.zip directory

También sé que puedo excluir archivos con la opción -x, así que pensé que esto podría funcionar:

zip -r zipfile.zip directory -x .*

No funcionó. Todos los directorios ocultos todavía estaban en el archivo zip.

Martin Thoma
fuente

Respuestas:

107

Esto también excluye los archivos ocultos en directorios no ocultos:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
organizar
fuente
2
Gracias por tu respuesta. El comando ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) es más largo de lo esperado, pero funciona bien. También se incluyen subdirectorios, por lo que +1 y una respuesta aceptada :-)
Martin Thoma
105

En primer lugar, si no ha instalado zip, instálelo primero de la siguiente manera:

sudo apt-get install zip

Luego, simplemente para crear un archivo zip:

zip -r compressed_filename.zip foldername

Si desea excluir archivos ocultos:

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

Excluir archivos de un archivo Zip (tomado de http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Los conceptos básicos de la exclusión de archivos al crear un archivo zip se centran alrededor de la -xbandera, que se utiliza para excluir archivos del archivo que coinciden con un nombre o patrón específico. En su forma más básica, se verá así:

zip archive.zip files -x "ExcludeMe"

Lo que significa que puede excluir un solo archivo, digamos que se llama "Nothanks.jpg"

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

Veamos algunos ejemplos específicos donde esto es útil.

Excluir archivos .DS_Store de archivos Zip

Esto evitará que los .DS_Store archivos de metadatos Mac normalmente invisibles se incluyan en un archivo zip, que se incluyen por defecto:

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

Sin embargo, si el directorio incluye subdirectorios, también querrá usar otra variación de ese comando para excluir los archivos ds_store de los subdirectorios:

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

Nota: no todos los shells requieren las comillas para que este comando funcione correctamente, pero en el shell bash (el predeterminado para OS X) necesitará usar las comillas para excluir con comodines y patrones.

Excluir tipos de archivo específicos de un archivo zip

Con los comodines, también puede excluir todos los archivos de un tipo determinado al enfocarse en la extensión. Por ejemplo, este comando comprimirá un directorio completo, menos cualquier .jpgarchivo:

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

Eso podría modificarse para cualquier extensión de archivo o patrón específico que coincida con un nombre de archivo.

Excluir el directorio .git o .svn de un archivo Zip

Comprime un directorio, menos .gity sus contenidos:

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

Comprime una carpeta, sin incluir el .svndirectorio:

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

Excluir todos los archivos ocultos de un archivo zip

Dado que se pueden usar patrones y comodines, también puede excluir cualquiera o todos los archivos y carpetas invisibles que se crean con el prefijo de un punto, ya sea un directorio como .svnun archivo individual como .bash_profileo .htaccess.

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

O para excluir todos los archivos invisibles de todos los subdirectorios:

zip -r archive.zip directory -x "*/\.*"
MAK Ripon
fuente
55
Gracias por su esfuerzo para ayudar a un usuario de Ubuntu. Tenga en cuenta que volver a indicar la respuesta aceptada en una nueva respuesta solo aumenta el desorden y tiene una alta probabilidad de ser marcado para su eliminación.
hmayag
54

Agregue "al .*(de lo contrario, su shell se expande .*a los archivos de puntos en el directorio actual), y también excluye los archivos ocultos en subdirectorios:

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

Esto dará como resultado que los archivos que comienzan con un .no se agreguen a su archivo 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
fuente
1
No creo que tu última declaración sea correcta. .*se expandiría por el caparazón.
hammar
1
Creo que es probable que sea correcto, pero lo
eliminé
Esto no funcionó. Se agregaron los directorios .svn
Martin Thoma
1
@moose El patrón de exclusión coincide con la ruta completa, no solo con el nombre base del archivo, por lo que debe excluir */.*así como .*( */coincide con cualquier secuencia de directorios no vacía).
Gilles
¡Esto funciona sin cambiar nada! La mejor respuesta.
Whitecat
8

Este incluye todos los "." directorios, subdirectorios y "." archivos o directorios dentro de directorios ... Esencialmente la primera respuesta, pero incluye el nivel superior "." archivos

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

Ejemplo para excluir todas las carpetas que comienzan con. :

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

Mejor comprimir pero más lento:

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

El método correcto sería:

zip -r zipfile.zip directory -x directory/.*
Rômulo Neves
fuente
@downvoter: ¿Qué pasa? Esto parece estar funcionando para mí.
jobin
El mismo problema que con la respuesta original de Rinzwind (ahora corregida): no está excluyendo subdirectorios. Y como señaló Rinzwind, debe citar los comodines, de lo contrario el shell los expandirá.
Gilles
4

Mientras comprime los directorios excluyendo alguna extensión de archivo:

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

Sin carpetas y archivos ocultos en el directorio:

zip -r zipfile.zip directory/*

directorio: |── .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
fuente