Crie um arquivo zip e ignore a estrutura de diretórios


216

Eu preciso criar um arquivo zip usando este comando:

zip /dir/to/file/newZip /data/to/zip/data.txt

Isso funciona, mas o arquivo zip criado cria uma estrutura de diretório que imita o diretório para o arquivo bruto. São muitas pastas extras que eu não preciso.

Não encontrei uma resposta rápida na página de manual ou em uma busca no Google.



2
Eu estava pensando que essa pergunta era anterior a todas as outras trocas de pilha, mas, infelizmente, o post do superusuário é mais antigo que esse. Se houver algo que eu possa fazer aqui para ajudar, me avise. Essa deve ser a resposta mais interessante, já que o Google ainda gera muito tráfego aqui. : D
Jake

Respostas:


351

Você pode usar -j.

-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).

19
Se -jnão funciona para o seu diretório (juntamente com -r) o checkout esta resposta
czerasz

em algum momento ele simplesmente não funciona ... preferem ligação @czerasz;) que basicamente é uma combinação pushd popd
TecHunter

36

O uso -jnão funcionará junto com a -ropção
Portanto, a solução alternativa pode ser esta:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Ou versão in-line

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

você pode direcionar a saída /dev/nullse não quiser que a cd -saída apareça na tela


Na verdade, você pode querer fazer o seguinte:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Como isso faz alguma diferença? Pelo contrário, fará com que você adicione não. de parentDir (..) para cada diretório no caminho: |
Vikas Tawniya

O resultado é o mesmo, eu concordo. Porém, em scripts automatizados que são executados em muitos ambientes diferentes, você geralmente evita caminhos globais, porque não tem idéia de qual será o caminho global. Mas a partir do cd path/to/parent/dir/você pode calcular o número de pontos duplos ../facilmente.
eddyP23

@ eddyP23 faz sentido #
Vikas Tawniya

33

Use a -jopção:

   -j     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 path).


3

Como alternativa, você pode criar um link simbólico temporário para o seu arquivo:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Isso funciona também para um diretório.


1

Reter o diretório pai para unzipnão vomitar arquivos em todos os lugares

Ao compactar diretórios, manter o diretório pai no archive ajudará a evitar desarrumar o diretório atual quando você descompactar o arquivo morto posteriormente

Portanto, para evitar reter todos os caminhos, e como você não pode usar -j e -r juntos (você receberá um erro), faça isso:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

A ../$(basename $PWD)é a mágica que mantém o diretório pai.

Então agora unzip my.zipvamos dar uma pasta contendo todos os seus arquivos:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Em vez de desarrumar o diretório atual com os arquivos descompactados:

file1
file2
dir1
├── file3
├── file4

0

Basta usar a -jrmopção para remover as estruturas de arquivo e diretório

zip -jrm /path/to/file.zip /path/to/file

tenha cuidado, -m --move Mova os arquivos especificados para o arquivo zip; na verdade, isso exclui os diretórios / arquivos de destino depois de criar o arquivo zip especificado. Se um diretório ficar vazio após a remoção dos arquivos, o diretório também será removido. Nenhuma exclusão é feita até o zip criar o arquivo sem erros. Isso é útil para economizar espaço em disco, mas é potencialmente perigoso, portanto, é recomendável usá-lo em combinação com -T para testar o archive antes de remover todos os arquivos de entrada.
catalint 4/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.