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.