Descompacte um arquivo em um diretório de destino?

2

Eu tenho um arquivo chamado All CRGs.zip e quero descompactar seu conteúdo em um diretório chamado data (que já existe e tem alguns outros arquivos).

Isso é possível? Estou trabalhando no OSX.

Eu tentei:

$ unzip "All CRGs.zip" -d data/

Mas isso descompacta tudo em data/All CRGs , o que não é o que estou procurando. Eu gostaria que tudo fosse direto para data .

Isso é possível?

    
por Richard 10.04.2015 / 10:31

2 respostas

3

Você pode recriar a estrutura de pastas completa incluindo a All CRGs -Folder ou pode omitir todas as pastas dentro do arquivo ZIP usando -j -flag para o comando unzip.

O problema é que o arquivo ZIP foi criado usando a All CRGs -Folder como nível superior, como zip "All CRGs.zip" "All CRGs" . A maneira correta seria zip "All CRGs.zip" "All CRGs/*" , o que criaria um arquivo ZIP de todos os arquivos e pastas dentro da pasta All CRGs sem a pasta circundante.

Assim, a única maneira de extrair apenas os arquivos, mantendo a estrutura da pasta, seria algo assim:

unzip "All CRGs.zip" -d data/ && mv "data/All CRGs/*" "data/" && rmdir "data/All CRGs"

Ele irá descompactar a pasta completa e, em seguida, mover o conteúdo da pasta para cima um nível e, finalmente, remover a (agora vazia) pasta "Todos os CRGs".

    
por 11.04.2015 / 09:06
1

Como você sabe que o arquivo zip contém uma pasta de nível superior indesejada e sabe o nome dessa pasta de nível superior, você pode usar um link simbólico para fazer com que todo o conteúdo dessa pasta apareça no pai da seguinte forma:

ln -s . 'data/All CRGs'
unzip 'All CRGs.zip' -d data

A etapa ln faz com que a pasta data/All CRGs seja criada, vinculando ao diretório atual (relativo a data/ ), que é data/ . Então, quando você extrair arquivos de All CRGs.zip e o comando unzip tentar criar data/All CRGs/file.dat , esse arquivo será criado como data/./file.dat .

Esta técnica pode ser demonstrada sem um arquivo zip usando o toque:

$ mkdir data
$ ln -s . data/subdir     
$ touch data/subdir/foo.txt
$ ls data
foo.txt subdir

Você também pode usar esse truque para fazer com que certos arquivos ou pastas sejam extraídos para uma pasta alternativa:

ln -s /tmp data/subdir2

Então, qualquer coisa no arquivo sendo extraído para subdir2 aparecerá em /tmp .

    
por 22.06.2017 / 21:02

Tags