Не так сложно написать такой сценарий, но нужно быть немного осторожнее. Проблема в том, что zip
файлы похожи на сжатые tar-файлы, и их разархивирование извлекает файлы. Не все файлы, сжатые с помощью gzip
, bzip2
или xz
, обязательно являются tar
файлами внизу (конечно, файл .tar.bz2
есть; так же как и файл .tgz
). Таким образом, вы должны определить, что вы хотите сделать с простым файлом .gz
, и хотите ли вы, чтобы файл tar всегда оставался без изменений.
Учитывая эту преамбулу, вы можете написать такой скрипт:
#!/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
Там не так много ракетостроения. Я предполагаю, что ваша версия tar
распознает файлы gzip
и bzip2
автоматически; если нет, то вам нужно сделать более или менее, как я сделал для xz
. Также есть --use-compress-program=XXX
для tar
GNU, но не все варианты tar
распознают ее. Понятно, что вы можете добавить больше моделей и (де) компрессоров, как считаете нужным. Распознать файлы CPIO и shar не так сложно. Список можно продолжить.
Большинство людей не заботятся о таком сценарии. Например, я обычно проверяю содержимое файла перед его извлечением. Вы можете добавить обработку аргументов в скрипт, чтобы обеспечить подробный вывод, или список вместо извлечения (-t
для tar
; -l
для unzip
) и, возможно, многословия.
Один шаг сложнее будет определить тип файла, когда суффикс не распознается. Вы можете запустить file
на файл и проанализировать, что он говорит. Другая возможность - проанализировать, будет ли содержимое файла помещено в подкаталог или нет; если нет, вы можете создать подкаталог и затем извлечь содержимое в подкаталог. Возможности легион.