Acabei de perceber que o 7-Zip (comando 7z
) pode fazer isso. O 7-Zip é capaz de extrair e compactar muitos tipos de arquivos. Aqui está uma citação de man 7z
:
DESCRIPTION
7-Zip is a file archiver with the highest compression ratio. The pro-
gram supports 7z (that implements LZMA compression algorithm), LZMA2,
XZ, ZIP, Zip64, CAB, RAR (if the non-free p7zip-rar package is
installed), ARJ, GZIP, BZIP2, TAR, CPIO, RPM, ISO, most filesystem
images and DEB formats...
O 7-Zip pode extrair / compactar arquivos e está detectando o próprio algoritmo de compactação.
Isso deve funcionar como você espera:
Comprimindo
$ 7z a file.tar.gz file
$ 7z a file.zip file
$ 7z a file.7z file
$ 7z a file.gzip file
Extraindo
$ 7z x file.tar.gz
$ 7z x file.zip
$ 7z x file.7z
$ 7z x file.gzip
Também aqui está um pequeno teste. Aqui eu crio cinco arquivos e dou a eles extensões de nome de arquivo diferentes.
$ cd /tmp
$ touch testfile
$ for alg in {zip,gzip,7z,tar.gz,rar};do 7z a testfile."$alg" testfile;done
$ ls testfile*
testfile.7z
testfile.gzip
testfile.rar
testfile.tar.gz
testfile.zip
Agora, para detectar o algoritmo de compactação, usarei o utilitário binwalk
.
$ for arch in testfile.*;do binwalk "$arch" | sed -n '4p' | awk {'print '};done
7-zip
gzip
7-zip
gzip
Zip