Diretório zip do Unix, mas excluiu subdiretórios específicos (e tudo dentro deles)

115

Estou tentando compactar um diretório (no Unix via SSH), mas preciso excluir alguns subdiretórios (e todos os arquivos e diretórios dentro deles).

Até agora eu tenho isso:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Mas isso não parece funcionar.

Eu também tentei

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

No entanto, isso ainda incluirá subdiretórios em ignoreDir1 e ignoreDir2.

A estrutura do subdiretório nos diretórios que desejo excluir é bastante substancial, portanto não posso simplesmente adicionar cada diretório ao argumento -x.

Alguém sabe como fazer isso?

sulman
fonte
@AlexanderMills - Veja esta pergunta.
JWW

Respostas:

130

Eu estava tão perto!

O comando real que eu preciso é:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
sulman
fonte
Legal, e obrigado por acompanhar! A propósito, você pode aceitar sua própria resposta.
Daniel H
2
Isso não funcionou para mim no osx. @ Pathfilder resposta fez embora.
rynop
11
Em vez disso: -x dir1 / ignoreDir1 / ** \ *, você pode fazer isso: -x dir1 / ignoreDir1 / \ *
Richard Gomes
67

Para o meu sistema em particular, a fim de excluir um diretório, eu tive que colocar aspas nos meus diretórios excluídos e funcionou como um encanto:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Notas:

- isso excluiu o diretório a ser excluído e todos os arquivos dentro dele.

- Você deve usar o caminho completo para os diretórios que deseja excluir!

desbravador
fonte
5
Este é o que funciona no Mac OS. :-)
Physicalattraction
9
Como ninguém explicou o motivo de exigir a citação dos caminhos ou a saída do asterisco, o motivo é o seguinte: Se o caminho não estiver entre aspas ou o curinga for escapado, o shell executará a expansão dos curingas antes de passá-los zip, o que receberá uma lista de caminhos para entradas nos diretórios especificados, mas não caminhos para arquivos dentro dos subdiretórios desses, fazendo zipcom que não ignore tudo nos diretórios especificados.
Zagrimsan
Eu acho que originalmente uma das razões Isso funcionou foi porque no Mac OS havia espaços em meus diretórios e isso evitou a necessidade de um \
pathfinder
Obrigado por esclarecer as coisas @zagrimsan. Isso resolveu o problema e explicou o motivo, para que possamos entendê-lo (o que também será útil no futuro para outras coisas). 👍
Synetech 25/06
8

@sulman usando:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 / ** \ * dir1 / ignoreDir2 / ** \ *

ainda incluirá a pasta dir1 / ignoreDir1 / vazia no arquivo zip, usando:

     zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 ** dir1 / ignoreDir2 **

Se você fizer o truque, também poderá usar um ** líder para pesquisar subpastas em vez de apenas dir1

Gianluca P.
fonte
Ah ok! Obrigado por esclarecer isso!
Sulman
7

O seguinte fará

zip -r myarchive.zip dir1 -x dir1 / ignoreDir1 \ * dir1 / ignoreDir2 \ *

O que você precisava **, @sulman?

Funciona como um encanto para mim da seguinte maneira:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)
ericn
fonte
Não sei por que o ** é necessário. Talvez alguém possa lançar alguma luz sobre isso?
Sulman
Desculpe, @sulman, digitei errado. O que eu quis dizer é como na minha edição mais recente. Funciona como um encanto para mim :) #
3100 ericn
1

Assim como outras respostas, mas excluindo diretórios completamente, em vez de excluir todo o conteúdo dos diretórios:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Richard Gomes
fonte
0

Eu encontrei este trabalho de David R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Excluiu o diretório e seu conteúdo.

Rick Ehrahrt
fonte
Certamente a barra invertida entre dir1e ignorDir2deve ser uma barra para a frente. Você quer dizer que as outras barras invertidas sejam barras invertidas? Se sim, você acabou de copiar a resposta de fuzzybee de dois anos atrás.
G-Man
-1

Para mim funcionou: zip -9 -r ~ / folded.zip online -x folder / folder2 / folder3 / foldern / \ * .

Parece que o asterisco deve ser escapado.

Francisco M
fonte
2
Como isso difere da solução de Rick Ehrahrt, um ano atrás, ou de Eric (mais alguns anos atrás)? Por favor, leia as soluções fornecidas antes de postar um novo ...
zagrimsan
Porque eu adicionei uma barra invertida antes do asterisco (ou seja, para escapar do asterisco). Na versão linux no meu trabalho não funciona se eu não fizer isso.
Francisco M
Também Rick Ehrahrt (2014) e Eric (2012) publicaram a mesma solução (para escapar do asterisco). Não há nada de errado com a solução, mas publicar a mesma várias vezes não faz sentido, a menos que se possa acrescentar profundidade à solução explicando por que a solução funciona. Em um caso simples como esse, não há mais nada a ser explicado. Por favor, não leve isso para o lado pessoal, minha única intenção aqui é ajudar a manter a SU limpa e concisa, para que os usuários possam encontrar a melhor solução com o mínimo de esforço.
zagrimsan