Questão Diretório unix zip, mas excluiu subdiretórios específicos (e tudo dentro deles)


Estou tentando fechar 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/**/* 

Isso não parece funcionar embora.

Eu também tentei

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

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

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

Alguém sabe como fazer isso?


81


origem


@AlexanderMills - Veja esta pergunta. - jww


Respostas:


Eu estava tão perto!

O comando real que eu preciso é:

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

86



Legal, e obrigado por seguir! Você pode aceitar sua própria resposta, a propósito. - Daniel H
Apenas o que eu estava procurando, obrigado cara! - Latheesan
Isso não funcionou para mim no osx. @pathfilder resposta fez embora. - rynop
Em vez disso: -x dir1 / ignoreDir1 / ** \ *, você pode fazer isso: -x dir1 / ignoreDir1 / \ * - Richard Gomes


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

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

Notas:

- isto excluiu o diretório para excluir e todos os arquivos dentro dele.

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


55



Este é o que funciona no Mac OS. :-) - physicalattraction
Como ninguém explicou o motivo para exigir a citação dos caminhos ou a fuga do asterisco, a razão é a seguinte: se o caminho não estiver entre aspas ou se o caractere curinga tiver escapado, o shell executará a expansão com curinga antes passando-os para zip, que receberá uma lista de caminhos para entradas nos diretórios especificados, mas não caminhos para arquivos dentro de subdiretórios daqueles, causando assim zip para não ignorar tudo sob os diretórios dados. - zagrimsan
Eu acho que originalmente uma das razões que isso funcionou foi porque no Mac OS havia espaços em meus diretórios e isso evitou a necessidade de um \ - pathfinder


O seguinte fará

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

O que você precisa do ** para @sulman?

Funciona como um charme para mim da seguinte forma:

[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%)

6



Eu não sei porque o ** é necessário. Talvez alguém possa esclarecer isso? - sulman
Desculpe, @sulman, digitei errado. O que eu quis dizer é como por minha última edição. Funciona como um encanto para mim :) - ericn


@sulman usando:

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

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

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

vai fazer o truque, você também pode usar um líder ** para pesquisar em subpastas em vez de apenas dir1


4



Ah ok! Obrigado por derramar a luz sobre isso! - sulman


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

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

1





Eu encontrei isso para trabalhar a partir de David R Heffelfinger:

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

Excluiu o diretório e seu conteúdo.


0



Certamente a barra invertida entre dir1 e ignorDir2 destina-se a ser uma barra invertida. Você quer dizer que as outras barras invertidas são barras invertidas? Se fizer isso, você acabou de copiar a resposta da fuzzybee de dois anos atrás. - G-Man


Para mim trabalhou:  zip -9 -r ~ / folded.zip online -x pasta / pasta2 / pasta3 / foldern /\ *.

Parece ser que o asterisco deve ser escapado.


-1



Como isso difere da solução de Rick Ehrahrt há um ano, ou de Eric (há alguns anos)? Por favor, leia as soluções fornecidas antes de postar uma nova ... - zagrimsan
Porque eu adicionei uma barra invertida antes do asterisco (que é 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) postaram a mesma solução (para escapar do asterisco). Não há nada de errado com a solução, mas postar a mesma várias vezes não faz sentido, a menos que se possa adicionar profundidade à solução, explicando por que a solução funciona. Em um caso simples como este, não há nada a ser explicado mais. Por favor, não tome isso pessoalmente, minha única intenção aqui é ajudar a manter SU limpo e conciso para que os usuários possam encontrar a melhor solução com o mínimo de esforço. - zagrimsan