Descompactar um arquivo em um diretório de destino?

4

Eu tenho um arquivo chamado All CRGs.zipe 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 o data/All CRGsque não é o que estou procurando. Eu gostaria que tudo fosse direto data.

Isso é possível?

Richard
fonte
Tenho certeza de que teria sido mais fácil clicar duas vezes nele, deixá-lo extrair para o local padrão [normalmente próximo ao .zip] e arrastar o conteúdo para o novo local.
Tetsujin
Sim, mas isso não é a minha pergunta :)
Richard

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

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

Portanto, a única maneira de extrair apenas os arquivos mantendo a estrutura de pastas seria algo como isto:

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

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

heiglandreas
fonte
"O caminho correto teria sido ..." não corresponde à minha expectativa. Tentei criar um arquivo zip usando essa sintaxe e recebo "nome não correspondido". Se eu retirar All CRGs/*as aspas, os arquivos são adicionados ao zip, mas com o diretório pai presente.
Jason R. Coombs
Houve pelo menos 2 novas versões do OS-X (macOS) desde que essa pergunta foi respondida. Então, pode ter havido uma mudança. Em qual versão do macOS você está trabalhando?
heiglandreas
Bom ponto. 10.12.5 é a versão mais recente e a versão que eu estava usando no momento deste comentário.
Jason R. Coombs
o mvcomando não moverá os arquivos ocultos. mv "data/All CRGs/.*" "data/"é necessário um adicional .
Kinjal Dixit 07/12/19
2

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

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

A lnetapa faz com que a pasta data/All CRGsseja criada, vinculando ao diretório atual (relativo a data/), que é data/. Em seguida, quando você extrai arquivos de All CRGs.zipe o unzipcomando tenta criar data/All CRGs/file.dat, esse arquivo será criado como data/./file.dat.

Essa técnica pode ser demonstrada sem um arquivo zip usando o touch:

$ 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

Em seguida, qualquer coisa no arquivo extraído subdir2será exibida /tmp.

Jason R. Coombs
fonte