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
|