名前に日付が付いたファイルまたはディレクトリをコピーするためのスクリプトを作成しています。たとえば、ファイル名test
がtest-20130901.bkup
これが私のスクリプトです
#!/usr/bin/bash
set -x
getopts fd TYPE
[ $TYPE = "d" ] && alias cp="cp -r"
backup_error() {
echo "${0##*/}: $1"
exit -1
}
typeset -r FROM_DIR=$2 TO_DIR=$3
if [ ! -e $FROM_DIR -a ! -d $FROM_DIR ] || [ ! -e $TO_DIR -a ! -d $TO_DIR ]
then
backup_error "One of the directories isn't exist or it maybe a file";
fi
typeset -r DATE=$(date "+%Y%m%d")
for filename in $FROM_DIR/*
do
if [ -$TYPE $filename ]
then
cp $filename $TO_DIR/${filename##*/}-$DATE.bkup
fi
done
unalias cp
スクリプトでは、ユーザーがスクリプトをファイルのみで実行するか、ディレクトリのみで実行するかを確認します。
-f
ファイルのみ
-d
ディレクトリのみ
[ $TYPE = "d" ] && alias cp="cp -r"
、この行は、使用する必要があるディレクトリに対してスクリプトが実行されるかどうかを確認するcp -r
ため、エイリアスを作成cp
しますcp -r
しかし、set -x
デバッグに使用すると、ユーザーが-d
オプションを使用するときにコマンドがエイリアスではなく元のcp
コマンドであることがわかります。if
デバッグ:
> ./backup.sh -d . .
+ getopts fdb TYPE
+ '[' d = d ']'
+ alias 'cp=cp -r'
+ typeset -r FROM_DIR=. TO_DIR=.
+ '[' '!' -e . -a '!' -d . ']'
+ '[' '!' -e . -a '!' -d . ']'
++ date +%Y%m%d
+ typeset -r DATE=20130901
+ '[' -d ./backup.sh ']'
+ '[' -d ./dir1 ']'
+ cp ./dir1 ./dir1-20130901.bkup
cp: ./dir1: is a directory
+ '[' -d ./file1 ']'
+ '[' -d ./file2 ']'
+ '[' -d ./test.sh ']'
+ unalias cp