extract(): одна команда для распаковки любых архивов

Одна функция вместо десятка команд

Когда требуется распаковать архив, каждый раз повторяется одна и та же история. Это tar.gz или tar.bz2? Какие флаги нужны для unrar? И как вообще запускать 7z? В итоге приходится снова открывать документацию или искать старые команды в истории. Самописная функция extract() как раз убирает эту лишнюю рутину.

Добавьте функцию в ~/.bashrc или ~/.zshrc:

extract() {
  if [ -f "$1" ]; then
    case "$1" in
      *.tar.bz2) tar xjf "$1" ;;
      *.tar.gz)  tar xzf "$1" ;;
      *.bz2)     bunzip2 "$1" ;;
      *.rar)     unrar x "$1" ;;
      *.gz)      gunzip "$1" ;;
      *.tar)     tar xf "$1" ;;
      *.tbz2)    tar xjf "$1" ;;
      *.tgz)     tar xzf "$1" ;;
      *.zip)     unzip "$1" ;;
      *.7z)      7z x "$1" ;;
      *)         echo "unknown archive" ;;
    esac
  fi
}

После этого примените изменения:

source ~/.bashrc

Функция сама понимает тип архива по расширению файла и подбирает подходящую команду. Вам остаётся только написать extract имя_файла и получить распакованное содержимое. Без подбора флагов, без поиска в интернете и без ошибок из-за случайных опечаток в параметрах.

Поддерживаются такие форматы: tar.gz, tar.bz2, bz2, rar, gz, tar, tbz2, tgz, zip, 7z.

Один и тот же синтаксис для любого формата. Если расширение не распознано, функция выведет unknown archive, а не завершится молча с ошибкой.

Что ещё можно улучшить

Базовый вариант уже вполне полезен, но его легко немного расширить. Например, добавить проверку, что нужная утилита действительно установлена, или выводить имя команды перед запуском. Вот более расширенная версия:

extract() {
  if [ ! -f "$1" ]; then
    echo "'$1' не найден"
    return 1
  fi

  case "$1" in
    *.tar.bz2) tar xjf "$1" ;;
    *.tar.gz)  tar xzf "$1" ;;
    *.bz2)     bunzip2 "$1" ;;
    *.rar)     unrar x "$1" ;;
    *.gz)      gunzip "$1" ;;
    *.tar)     tar xf "$1" ;;
    *.tbz2)    tar xjf "$1" ;;
    *.tgz)     tar xzf "$1" ;;
    *.zip)     unzip "$1" ;;
    *.7z)      7z x "$1" ;;
    *)         echo "Формат не поддерживается: '$1'" ; return 1 ;;
  esac
}