tar archive を解凍する


0. Contents

1. Concept
2. Script Source
3. How to Use


1. Concept

tar コマンドは gzip、bzip2 等の圧縮形式によって必要なオプションが違う。
また、ディレクトリに格納しないで圧縮したファイルはそのまま解凍すると
カレントに大量のファイルがばら撒かれてしまい、非常に迷惑である。

これは、そういった処理を自動化するために書いたサブルーチンである。


2. Script Source

ソースは以下の通り (ダウンロード)。

#! /usr/bin/env bash

function eta(){
## 変数をセット
  local FDir AFile
  declare -i Flag=0
  declare -a List

## 引数をチェック
  while (( $# > 0 )) ; do
    case "$1" in
      -d|--delete) Flag=1 ;;

      -o)
        if [[ -d "$2" ]] ; then
           FDir=$2

        else
          echo "error: $FUNCNAME: $1 $2: Invalid argument." 1>&2
          return 1
        fi && false
      ;;

      *) List[${#List[@]}]=$1
    esac && shift || shift 2
  done
  (( ${#List[@]} > 0 )) || {
    echo "error: $FUNCNAME: No argument." 1>&2
    return 1
  }

## 関数の定義
  function eta_main(){
  ## ファイルのチェック
    [[ -f "$AFile" ]] || {
      echo "error: $FUNCNAME: $AFile: Not regular file." 1>&2
      return 1
    }

  ## 変数をセット
  local COpt LFile ODir

  ## Archive の種類を特定
    case "$AFile" in
    ## tar
      *.tar) ;;

    ## gzip
      *.tgz|*.tar.gz) COpt='-z' ;;

    ## bz2
      *.tbz|*.tar.bz2) COpt='-j' ;;

      *)
        echo "error: $FUNCNAME: $AFile: Not supported format." 1>&2
        return 1
      ;;
    esac

  ## Archive のリストを取得
    LFile=$( tar -t -f "$AFile" $COpt ) || return

  ## $LFile 別処理
    ## 通常アーカイブ
    if [[ "$( echo "$LFile" |cut -d '/' -f 1 |uniq |grep -c '' )" -eq 1 ]] ; then
      if [[ -n "$FDir" ]] ; then
        ODir=$FDir

      elif [[ -z "${AFile##*/*}" ]] ; then
        ODir=${AFile%/*}

      else
        ODir='./'
      fi

    ## トップが単独ディレクトリではない場合
    else
      ODir=${AFile%.t*}
      [[ -n "$FDir" ]] && ODir="${FDir}/${ODir##*/}"

      mkdir -p "$ODir" || return
    fi

    if tar -x -f "$AFile" -C "$ODir" -k $COpt ; then
      (( Flag == 1 )) && rm -f "$AFile"
      echo "$FUNCNAME: $AFile: Extract succeeded."

    else
      echo "error: $FUNCNAME: $AFile: Extract failed." 1>&2
      false
    fi
  }

## メインルーチン
  for AFile in "${List[@]}" ; do
    eta_main
  done
}
eta "$@"


3. How to Use

USAGE、OPTION は以下の通り。

USAGE: eta (Options) [Archive]...

   -d, --delete
      : delete source file

   -o [Directory]
      : set output directory