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 |