Compacte um arquivo morto sem incluir o diretório pai

30

Quero compactar muitas pastas em uma árvore de diretórios como essa

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Quando tento compactá-lo, ele cria um arquivo zip com a pasta v em vez do conteúdo (subdiretórios e arquivos)

Como posso evitar isso?

Dami
fonte

Respostas:

23

Então, se eu entendi direito, você está tentando arquivar os arquivos e pastas em uma pasta específica, mas sem incluir a pasta raiz.

Exemplo:

/test/test.txt
/test/test2.txt

onde test.txt e test2.txt seriam armazenados no zip, mas não / test /

Você pode entrar no diretório / test / e depois executar algo como,

zip -r filename.zip ./*

O que criaria um arquivo na mesma pasta denominada filename.zip. Ou, se estiver executando-o de fora da pasta, você poderá executar,

zip -r test.zip test/*

O / * é a parte que inclui apenas o conteúdo da pasta, em vez da pasta inteira.

Edit: OP queria vários zips, solução acabou sendo um pouco de hack, estou curioso para saber se existe uma maneira melhor de fazer isso.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;
zzbomb
fonte
sim, mas tenho muitos arquivos nos quais faço a mesma coisa, por isso seria tedioso assim, existe um script bash ou algo que automatizaria o mesmo processo no diretório que possui todas as pastas
Dami
1
Ok, eu executei o script e ele criou o diretório pai no arquivo. Quero apenas o conteúdo da pasta no arquivo
Dami
1
meu erro, perdeu um pouco. adicionou um parâmetro -j que eu apenas procurei, aparentemente ignora a parte que você não deseja. tente isto:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb
18
zip -r teste test.zip / * do lado de fora acrescenta teste como diretório para o arquivo zip
smihael
4
como @smihael afirmou, zip -r test.zip test/*não funciona. existe alguma maneira correta de conseguir isso fora do diretório?
andrhamm
22

Use a opção -jou --junk-pathsno seu comando zip.

Na página do manual zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).
robrtsql
fonte
Esta parece ser a resposta correta.
mutant_city 24/02
3
E quanto a caminhos / pastas aninhados?
GuyPaddock 13/03
3
Isso omitirá todas as pastas no arquivo morto e, se você tiver nomes de arquivos duplicados em pastas diferentes, isso explodirá. Isso tem seu lugar, mas apenas se você não se importa com pastas e apenas deseja arquivos. Não é o que o OP estava pedindo, mas ainda um bom conhecimento
Govind Rai
17

E esse comando?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..
aluc
fonte
5
Embora esta seja uma resposta correta, a introdução não soa como se você estivesse convencido. Também ajudaria a explicar um pouco o que o comando faz.
Nephente 11/03/16
1
Essa também foi minha solução, mas não gosto porque envolve cd. Esperava que houvesse uma maneira de especificar o caminho armazenado com mais precisão.
Nskp 14/10
3

Espero que isto ajude.

(cd directory && zip -r ../out.zip .)

Ele mantém o shell principal no mesmo diretório e altera apenas o diretório do sub shell que morre após o comando.

Kenneth
fonte
Queria adicionar isso como um comentário à resposta do @Alfred UC , mas não tenho reputação suficiente para isso.
Kenneth
Se ele realmente resolver o problema, poderá ser uma solução.
Yufenyuy Veyeh Dider
Isso é melhor como resposta. Isso funciona tanto no bash quanto no sh?
Arlen Beiler 29/09