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.

Jake
fonte
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).
Lars Kotthoff
fonte
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

Vikas Tawniya
fonte
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).
Dan D.
fonte
18

Um pouco relacionado - eu estava procurando uma solução para fazer o mesmo para diretórios. Infelizmente, a -jopção não funciona para isso :(

Aqui está uma boa solução sobre como fazê-lo: /superuser/119649/avoid-unwanted-path-in-zip-file

escamoso
fonte
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.

MirkoBanchi
fonte
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
AndrewD
fonte
0

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

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
fonte
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