unzip file, qual diretório foi criado?

7

Objetivo:

Após expandir o arquivo a.zip usando o comando unzip on Ubuntu 12.10 , atribua o nome da pasta a.zip expandida para bash variable v .

a.zip é assumido e garantido para expandir para uma única pasta, em vez de várias pastas.

Exemplo:

Se unzip a.zip for expandido para a pasta ./foo/ , echo $v retornará foo .

Meu ambiente:

GNU/Linux (kernel 3.5.0-25-generic)
Ubuntu 12.10    
bash v4.2.37(1)-release
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.

Solução atual Estou insatisfeito com: expandir via unzip -d bar a.zip , então v=$(ls -1 bar) fornece o resultado correto, mas atrapalha o sistema de arquivos.

    
por Robottinosino 03.04.2013 / 22:25

4 respostas

4

Aqui você vai:

v=$(unzip a.zip | grep -m1 'creating:' | cut -d' ' -f5-)

Explicação

  • $(...) é um shell de captura. Ele captura a saída dos comandos dentro dele e os substitui como uma variável.
  • A saída do comando unzip é direcionada para grep , que recebe o argumento -m1 para retornar apenas o primeiro resultado e o texto creating: , que faz parte do texto unzip imprime para stdout quando cria um diretório. grep imprime creating: foo/ para stdout, que é canalizado cut .
  • cut é usado para imprimir todas as colunas (separadas por espaços) após a segunda. Nós especificamos de 5 até o final da linha, porque a palavra creating: é prefixada com alguns espaços. Queremos usar todas as colunas até o final da linha, caso o nome do diretório tenha espaços. A saída final é foo/ .
por 04.04.2013 / 00:00
2
  • Você pode usar unzip -l para listar o conteúdo do arquivo e analisar a saída
  • Ou você pode listar o diretório, extrair o arcival que lista o diretório novamente e comparar as duas listagens usando diff
por 03.04.2013 / 22:30
1

O sistema de arquivos AVFS apresenta uma visão do sistema de arquivos no qual cada arquivo /path/to/foo.zip está acessível como um diretório ~/.avfs/path/to/foo.zip# .

mountavfs
ls ~/.avfs$PWD/foo.zip\#

Se o comando ls mostrar um único diretório, descompactar o arquivo zip criará esse diretório e criará arquivos abaixo dele. Observe que um arquivo zip pode ou não ser organizado dessa maneira.

Veja um snippet que verifica sua suposição e define dir para o nome do diretório, se aplicável. Aviso: se o arquivo zip contiver arquivos cujo nome começa com . (arquivos de pontos), eles serão ignorados.

zip_directory_name () {
  case $1 in
    /*) ;;
    *) set "$PWD/$1";;
  esac
  cd ~/.avfs${1}\# || exit 2
  set -- *
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    printf %s "$1"
  else
    return 1 # more than one top-level file, or a single non-directory
  fi
}
dir=$(zip_directory_name foo.zip) || exit $?
    
por 04.04.2013 / 03:05
1

Fique insatisfeito com sua solução alternativa, se quiser, mas na verdade é a solução correta.

d="'mktemp -d'"
unzip -d "$d" "$zipfile"
v="'basename "$d"/*'"
mv "$d"/"$v" "$v"
rmdir "$d"
echo "$v"

Isso é detalhado, mas - desde que haja apenas um diretório no arquivo zip, que você provavelmente deveria verificar primeiro - é confiável.

ls e grep é menos confiável porque depende de como a saída se parece. Em uma localidade diferente, pode não haver nenhuma string "creating:". Na próxima versão do unzip, ele poderia ser alterado por qualquer motivo.

    
por 04.04.2013 / 16:28

Tags