Comando shell do UNIX para expandir arquivos de qualquer tipo compactado

3

Existe algum comando shell do UNIX para expandir um arquivo compactado cujo tipo não é conhecido antecipadamente?

Eu deveria poder usar este comando para expandir pelo menos qualquer um dos seguintes tipos de arquivos, embora a capacidade de trabalhar com qualquer outro tipo conhecido (como .rar ou .7z) seja bem-vinda:

  • tar
  • tar.gz
  • tgz
  • gz
  • gzip
  • bz2
  • zip

Idéias mais simples envolvendo comandos de uma linha são as melhores soluções, mas qualquer comentário é apreciado.

    
por NPalopoli 10.12.2012 / 02:29

1 resposta

6

Não é tão difícil escrever um roteiro como esse, mas você precisa ser um pouco cuidadoso. O problema é que zip arquivos são como arquivos tar compactados e descompactá-los extrai os arquivos. Nem todos os arquivos compactados com gzip , bzip2 ou xz são necessariamente tar arquivos abaixo (é claro, um .tar.bz2 file é; portanto, é um .tgz file). Então você tem que definir o que você quer que seja feito com um arquivo .gz simples, e se você quer sempre um untarredo no arquivo tar.

Dado esse preâmbulo, você pode escrever um script como:

#!/bin/sh

# Optionally override the default commands
: ${GZIP:=gzip}
: ${TAR:=tar}
: ${BZIP2:=bzip2}
: ${XZ:=xz}
: ${UNZIP:=unzip}

for file in "$@"
do
    case "$file" in
    (*.tar.gz|*.tgz|*.tar)
        $TAR -xf "$file";;
    (*.tar.xz)
        $XZ -cd "$file" | $TAR -xf -;;
    (*.xz)
        $XZ -d "$file";;
    (*.gz)
        $GZIP -d "$file";;
    (*.tar.bz2)
        $TAR -xf "$file";;
    (*.bz2)
        $BZIP2 -d "$file";;
    (*.zip)
        $UNZIP "$file";;
    (*) echo "$0: unrecognized file type $file" >&2;;
    esac
done

Não há muita ciência de foguetes lá. Estou assumindo que sua versão de tar reconhece os arquivos gzip e bzip2 automaticamente; se não, então você precisa fazer mais ou menos como eu fiz para xz . Existe também uma opção --use-compress-program=XXX para o GNU tar , mas nem todas as variantes do tar o reconhecem. Claramente, você pode adicionar mais padrões e (des) compressores como achar melhor. Reconhecer CPIO e arquivos shar não seria tão difícil. A lista continua.

A maioria das pessoas não se incomoda com esse roteiro. Por exemplo, costumo verificar o conteúdo do arquivo antes de extraí-lo. Você pode adicionar manipulação de argumentos ao script para permitir saída detalhada ou listar em vez de extrair ( -t para tar ; -l para unzip ) e talvez verbosidade.

Um passo mais difícil seria identificar o tipo de arquivo quando o sufixo não é reconhecido. Você pode executar file no arquivo e analisar o que ele diz. Outra possibilidade é analisar se o conteúdo do arquivo será colocado em um subdiretório ou não; se não, você pode criar um subdiretório e extrair o conteúdo no subdiretório. As oportunidades são legiões.

    
por 10.12.2012 / 02:47