Como posso criar um arquivo zip de um diretório inteiro via terminal sem arquivos ocultos?

220

Eu tenho um projeto com muitas pastas / arquivos ocultos. Eu quero criar um arquivo zip, mas no arquivo não deve haver pastas / arquivos ocultos. Se os arquivos em uma pasta oculta não estiverem ocultos, eles também não deverão ser incluídos.

Eu sei que posso criar um arquivo zip de um diretório como este:

zip -r zipfile.zip directory

Também sei que posso excluir arquivos com a opção -x, então pensei que isso poderia funcionar:

zip -r zipfile.zip directory -x .*

Não deu certo. Todos os diretórios ocultos ainda estavam no arquivo zip.

Martin Thoma
fonte

Respostas:

107

Isso também exclui arquivos ocultos em diretórios não ocultos:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
organizar
fonte
2
Obrigado pela sua resposta. O comando ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) é mais longo que o esperado, mas funciona bem. Subdiretórios também estão incluídos, por isso +1 e uma resposta :-) aceito
Martin Thoma
105

Antes de tudo, se você não tiver instalado o zip, instale-o primeiro da seguinte maneira:

sudo apt-get install zip

Então, simplesmente para criar um arquivo zip:

zip -r compressed_filename.zip foldername

Se você deseja excluir arquivos ocultos:

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

Excluindo arquivos de um arquivo zip (extraído de http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Os princípios básicos da exclusão de arquivo ao criar um arquivo zip são centralizados em torno do -xsinalizador, que é usado para excluir arquivos do arquivo que correspondem a um nome ou padrão específico. No mais básico, ficará assim:

zip archive.zip files -x "ExcludeMe"

O que significa que você pode excluir um único arquivo, digamos, com o nome "Nothanks.jpg"

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

Vamos cobrir alguns exemplos específicos em que isso é útil.

Excluir arquivos .DS_Store dos arquivos zip

Isso impedirá que os .DS_Store arquivos de metadados do Mac, normalmente invisíveis, sejam incluídos em um arquivo zip, que são agrupados por padrão:

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

Se o diretório incluir subdiretórios, no entanto, você desejará usar outra variação desse comando para excluir os arquivos ds_store dos subdiretórios também:

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

Nota: nem todos os shells exigem que as cotações para este comando funcionem corretamente, mas no shell bash (o padrão para OS X), você precisará usar as aspas para excluir com caracteres curinga e padrões.

Excluir tipos de arquivo específicos de um arquivo zip

Com curingas, você também pode excluir todos os arquivos de um determinado tipo, concentrando-se na extensão. Por exemplo, este comando compactará um diretório inteiro, menos os .jpgarquivos:

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

Isso pode ser modificado para qualquer extensão ou padrão de arquivo específico correspondente a um nome de arquivo.

Excluir o diretório .git ou .svn de um arquivo zip

Zip um diretório, menos .gite seu conteúdo:

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

Compacte uma pasta, sem incluir o .svndiretório:

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

Excluir todos os arquivos ocultos de um arquivo zip

Desde padrões e curingas podem ser usados, você também pode excluir um ou todos os arquivos e pastas invisíveis que são feitas assim por ser prefixados com um período, se é um diretório como .svnou um arquivo individual como .bash_profileou .htaccess.

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

Ou, para excluir todos os arquivos invisíveis de todos os subdiretórios:

zip -r archive.zip directory -x "*/\.*"
MAK Ripon
fonte
5
Obrigado pelo seu esforço para ajudar um colega usuário do Ubuntu. Lembre-se de que declarar a resposta aceita em uma nova resposta apenas aumenta a confusão e tem uma alta probabilidade de ser sinalizado para remoção.
hmayag
54

Adicione "ao .*(caso contrário, seu shell se expandirá .*para os arquivos de ponto no diretório atual) e também exclua os arquivos ocultos nos subdiretórios:

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

Isso resultará em arquivos começando com um arquivo a .não ser adicionado ao seu arquivo 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
fonte
1
Não acho que sua última afirmação esteja correta. .*seria expandido pelo shell.
27711 hammar
1
Eu acho que é provável que seja correto, mas eu o retirei (não tenho certeza sobre isso) :)
Rinzwind
isso não funcionou. Os diretórios .svn foram adicionados
Martin Thoma
1
@moose O padrão de exclusão corresponde ao caminho completo, não apenas ao nome da base do arquivo, portanto você precisa excluir */.*também .*( */corresponde a qualquer sequência não-vazia de diretórios).
Gilles
Isso funciona sem alterar nada! Melhor resposta.
Whitecat 7/10
8

Este inclui todos os "." diretórios, subdiretórios e "." arquivos ou diretórios dentro de diretórios ... Essencialmente a primeira resposta, mas inclui o nível superior "." arquivos.

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

Exemplo para excluir todas as pastas que começam com. :

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

Melhor comprimir, mas mais lento:

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

O método correto seria:

zip -r zipfile.zip directory -x directory/.*
Rômulo Neves
fonte
@ downvoter: O que há de errado, isso parece estar funcionando para mim.
Jobin
O mesmo problema da resposta original de Rinzwind (agora corrigida): você não está excluindo subdiretórios. E, como Rinzwind observou, é necessário citar os curingas, caso contrário, o shell os expandirá.
Gilles
4

Ao compactar dirs, excluindo algumas extensões de arquivo:

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

Sem pastas e arquivos ocultos no diretório:

zip -r zipfile.zip directory/*

diretório: |── .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
fonte