3

Существует ли какая-либо команда оболочки UNIX для расширения сжатого файла, тип которого заранее неизвестен?

Я должен иметь возможность использовать эту команду для расширения по крайней мере любого из следующих типов файлов, хотя возможность работы с любыми другими известными типами (такими как .rar или .7z) приветствовалась бы:

  • деготь
  • tar.gz
  • TGZ
  • GZ
  • GZIP
  • BZ2
  • застежка-молния

Простые идеи, включающие однострочные команды, были бы лучшими решениями, но любой комментарий приветствуется.

1 ответ1

6

Не так сложно написать такой сценарий, но нужно быть немного осторожнее. Проблема в том, что 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 на файл и проанализировать, что он говорит. Другая возможность - проанализировать, будет ли содержимое файла помещено в подкаталог или нет; если нет, вы можете создать подкаталог и затем извлечь содержимое в подкаталог. Возможности легион.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .