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


Eu tenho um projeto com muitas pastas / arquivos ocultos nele. Eu quero criar um arquivo zip dele, 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 devem ser incluídos.

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

zip -r zipfile.zip directory

Eu 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 funcionou. Todos os diretórios ocultos ainda estavam no arquivo zip.


189
2017-08-27 18:01


origem




Respostas:


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

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

98
2017-08-27 19:27



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, então +1 e uma resposta aceita :-) - Martin Thoma


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

sudo apt-get install zip

Então, por simplesmente criar um arquivo zip:

zip -r compressed_filename.zip foldername

Se você quiser excluir arquivos ocultos:

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

69
2017-08-11 06:28



Obrigado pelo seu esforço em ajudar um colega usuário do Ubuntu. Lembre-se de que reafirmar a resposta aceita em uma nova resposta apenas aumenta a desordem e tem uma alta probabilidade de ser sinalizada para remoção. - hmayag


Adicionar " ao .* (caso contrário, seu shell se expande .* aos arquivos de ponto no diretório atual) e também excluir arquivos ocultos em subdiretórios:

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

Isso resultará em arquivos que começam com um . para 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%)

52
2017-08-27 19:17



Eu não acho que sua última declaração esteja correta. .* seria expandido pelo shell. - hammar
Eu acho que é provável que seja correto, mas eu removi (não tenho certeza sobre isso) :) - Rinzwind
isso não funcionou. Os diretórios .svn foram adicionados - Martin Thoma
@moose O padrão de exclusão corresponde ao caminho completo, não apenas ao nome base do arquivo, portanto, você precisa excluir */.* assim como .* (*/ corresponde a qualquer sequência não vazia de diretórios). - Gilles
Isso funciona sem mudar nada! Melhor resposta. - Whitecat


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 -@

8
2017-11-01 03:19





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 '.*'

8
2018-05-21 16:51





O método correto seria:

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

5
2018-05-08 16:49



@downvoter: O que há de errado, isso parece estar funcionando para mim. - jobin
O mesmo problema que com A resposta original de Rinzwind (agora corrigido): você não está excluindo subdiretórios. E, como Rinzwind observou, você precisa citar os curingas, caso contrário, o shell os expandirá. - Gilles


Enquanto fecha dirs excluindo alguma extensão de arquivo:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

4
2017-12-08 17:49