AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 407453
Accepted
Cheeku
Cheeku
Asked: 2017-11-29 02:04:31 +0800 CST2017-11-29 02:04:31 +0800 CST 2017-11-29 02:04:31 +0800 CST

Como saber antecipadamente se um .zip tem um diretório pai dentro

  • 772

Em várias ocasiões, digamos que eu tenha a.zip, que se descompacta em a/*si mesmo.

No entanto, muitas vezes existem arquivos zip que derramam todo o seu conteúdo no diretório atual. Isso exige que eu crie manualmente um diretor ae descompacte nele.

Mas se como política eu sempre crio um diretório, e o zip acaba sendo do primeiro tipo, minha estrutura parece a/a/*que não é a ideal.

Existe uma maneira de descompactar a.zipindependentemente a/*de seu tipo entre os dois tipos que descrevi acima?

files filesystems
  • 2 2 respostas
  • 405 Views

2 respostas

  • Voted
  1. AntumDeluge
    2017-11-29T02:41:28+08:002017-11-29T02:41:28+08:00

    Use zipinfopara exibir, conteúdo zip.:

    $ zipinfo -1 a.zip
    

    No entanto, isso provavelmente não responde à sua pergunta se você estiver procurando por uma resposta de automação.

    Edit: O que você pode fazer é verificar cada linha de saída de zipinfoum caractere de barra. Se houver uma linha faltando o caractere, você sabe que ele está localizado na raiz do arquivo zip.

    Infelizmente, não consigo pensar exatamente como fazer isso de cabeça. Não tenho certeza se funcionará, mas aqui está um comando não testado:

    $ MKROOT=0
    $ for X in $(zipinfo -1 a.zip); do $(echo "${X}" | grep "/"); if test "$?" -gt "0"; then MKROOT=1; fi; done
    $ if test "${MKROOT}" -gt "0"; then mkdir "a"; cd "a"; unzip "../a.zip"; else unzip "a.zip"; fi
    

    Editar: a sugestão de Mark Perryman é provavelmente melhor. Acabei de perceber que meu comando verifica se os arquivos estão contidos em subpastas, mas não verifica se todos estão contidos na mesma pasta raiz.

    • 1
  2. Best Answer
    NarūnasK
    2017-11-29T02:50:27+08:002017-11-29T02:50:27+08:00

    Tente isto:

    archive="archive.zip"
    has_parent=$(unzip -l "$archive" | tail -n+4 | head -n-2 | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
    if test "$has_parent" -eq 1; then
      unzip $archive
    else
      dir="./$(basename ${archive%%.zip})"
      mkdir "$dir"
      unzip -d "$dir" $archive
    fi
    

    Se estiver usando zipinfo, você pode espremer $has_parenta linha para isso:

    has_parent=$(zipinfo -1 "$archive" | awk '{split($NF,a,"/");print a[1]}' | sort -u | wc -l)
    

    A ideia é simples - se houver vários arquivos no nível raiz do arquivo, obviamente irá destruir seu diretório atual se você descompactá-lo, portanto, você deve criar um diretório pai com antecedência e descompactar os arquivos lá. Caso contrário, se todos os arquivos no arquivo tiverem o mesmo pai, não há problema em descompactar no diretório atual.

    • 1

relate perguntas

  • Disco alocado dinamicamente do Virtualbox *.vdi continua crescendo

  • Como encontrar tipos de arquivos específicos e tar-los?

  • du/df e ls relatando diferentes usos de disco

  • Como os desenvolvedores do kernel Linux lidam com seu trabalho com milhões de linhas de código? É um método? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve