Dependendo de como um arquivo zip é criado, algumas vezes ele extrai todos os arquivos diretamente e outras vezes extrai os arquivos em um subdiretório.
Se o último for verdadeiro, como forçar o unzip
comando a "ignorar" esse diretório de primeiro nível?
Exemplo:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
O que estou recebendo é /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
O que eu quero é dos arquivos extraídos /tmp/omeka/
, (um nível acima e nenhum número de versão incluído na estrutura de diretórios)
/tmp/omeka/(files)
Eu sei que posso usar a -j
opção para "caminhos indesejados", mas quero manter a estrutura do subdiretório, mas não a estrutura de diretórios de nível superior. Como posso fazer isso?
mv
os arquivos, mas eu queria ver se havia uma maneira de fazer isso imediatamente a partir do comando de descompactação/wordpress/
diretório (sem número de versão) dentro do arquivo zip. Na verdade, é bomunzip
,mv
mas não ter controle sobre isso e fazê-lo em duas etapas sempre me irritou um pouco. Felizmente Wordpress também vem em um.tar.gz
sabor :)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Respostas:
Use um sistema de arquivos FUSE que permita navegar por arquivos como diretórios, como o AVFS . Use
cp
para extrair os arquivos para o diretório de sua escolha.Como assumimos que existe um único diretório de nível superior no arquivo morto, você pode reduzi-lo para
fonte
unzip
tivesse alguma mágica para fazer isso, como especificar os arquivos a serem extraídos*/*
, que eu pudesse usar sem instalar outro utilitário, mas acho que não. Obrigado. +1Se o seu arquivo zip não contiver estrutura de diretórios ou você não precisar preservá-lo, poderá usar o seguinte:
fonte
Este script não é robusto, mas funciona nos casos simples:
Apenas verifica se existe exatamente um subdiretório e, se houver, move tudo para fora e o exclui.
fonte
Acabei de me registrar hoje, por isso não posso votar em @SteveBennet e não posso adicionar um comentário lá.
Com base em sua resposta, criei uma função recursiva como esta:
Assim como o @SteveBennet disse: esse script não é robusto, mas funciona nos casos simples.
Espero que seja útil.
fonte
Necessidade parece
patch --strip=n
opçãoSeria desejável ter uma opção como
patch --strip=number
(ou-pnumber
) que corta osnumber
componentes do caminho no início (ref. Comparando e mesclando arquivos: diretórios de correção ).Outra solução, aplicabilidade
Na falta disso, existe outra solução, meio hackeada, mas funciona. No meu caso, eu queria sobrescrever um diretório cheio de arquivos existentes com o conteúdo de um zip, sem extrair o zip completo primeiro.
Quando essa solução funcionar e a solução da @ Gilles estiver disponível, a última também funcionará. No entanto, esta solução não requer disponibilidade de um sistema de arquivos FUSE.
Como fazer isso
Supondo que você conheça o diretório extra, no seu caso
omeka-1.5.1
, você pode fazer isso:unzip
tentará descompactar para oomeka-1.5.1
qual é realmente um link simbólico para conter dir. Como resultado, os arquivos serãoomeka
direcionados diretamente.Variantes possíveis
Você pode imaginar variantes para redirecionar uma ou mais partes de uma hierarquia de depeer.
Conclusão
Essa solução é um pouco específica, mas tem seus casos de uso e eu acabei de usá-la.
fonte
unzip -l
. Isso pode até ser automatizado usando um script que descobre parte do caminho comum.zipinfo -1
pode ser um bom começo. Qual é o seu caso de uso?Provavelmente você deseja executar
unzip
com a-j
opção, como em:Mas você pode se surpreender com o seu comportamento:
Se você extrair
files.zip
no diretório de saída./output
e obter isso como resultado:então a
-j
opção fornecerá a você (todos os caminhos divididos):fonte