Eu faria algo assim (sintaxe zsh):
unz() (
tmp=$(TMPDIR=. mktemp -d -- ${${argv[-1]:t:r}%.tar}.XXXXXX) || exit
print -r >&2 "Extracting in $tmp"
cd -- $tmp || exit
[[ $argv[-1] = /* ]] || argv[-1]=../$argv[-1]
(set -x; "$@"); ret=$?
files=(*(ND[1,2]))
case $#files in
(0) print -r >&2 "No file created"
rmdir -v "../$tmp";;
(1) mv -v -- $files .. && rmdir -v ../$tmp;;
(*) mv -vT ../$tmp ../$tmp:r;;
esac && exit $ret
)
Isto é:
- crie um diretório em qualquer pasta
- execute o comando
- dependendo de quantos arquivos o comando gerou:
- remova esse diretório (se ele não criou nenhum arquivo)
- se tiver criado apenas um arquivo / dir, mova-o um nível para cima e descarte nosso diretório
- caso contrário, tente remover a string aleatória do final do nosso diretório temporário.
Dessa forma, você pode fazer:
unz unzip foo.zip
unz tar xf foo.tar.gz
Ele assume que o último argumento para o comando de extração é o arquivo a ser extraído. Ele também assume ferramentas GNU para as opções -v
. Em sistemas não-GNU, você pode removê-los e possivelmente fazer o log manualmente. mv -T
também é específico do GNU e forçará mv
a tentar renomear apenas.