ホーム » Tips集 » Shell » backer.sh

Tips集

backer.sh

  • 任意のファイルのバックアップを作成するためのコマンド
  • バックアップ用のディレクトリを作成し、ファイル名に番号を付けて保存していく最も単純で原始的なバージョン管理方法
  • カレントディレクトリに back というディレクトリを作成していれば、その下にバックアップ用のディレクトリおよびバックアップを作成する
  • [オプション]
  • 引数= ファイル名 選択したファイル用のバックアップ用ディレクトリを作成、ナンバリングしたバックアップファイルを保存。
  • [作成意図] 念のためささっとバックアップファイルを作るために作った。無秩序にバックアップファイルを作ると、ちょっとずつ違う名前のバックアップファイルが増えていって困るが、backer.sh を使うととりあえず番号順に保存してくれる。
#!/bin/bash
#$Id: backer.sh,v 1.7 2014-01-03 04:03:42+09 shirai Exp shirai $

backer(){
	check_options $@
	Ind=1
	for file in ${ArgFiles[@]}
	do
		echo "[${Ind}] $file"
		check_BackDir $file
		if [ "$check" = 0 ]; then
			#counter=(`ls $BackDir | grep "_" | wc -w`)
			counter=(`ls $BackDir | grep "_" | wc -l`)
			BackFile="${counter}_${FileName}"
			DiffFile=""
			while true
			do
				if [ -f $BackDir/$BackFile ];then
					((counter++))
					BackFile="${counter}_${FileName}"
				else
					if [ $counter != 0 ]; then
						DiffFile="$((counter-1))_${FileName}"
					fi
					break
				fi
			done
			if [[ "$DiffFile" != "" ]]; then
				DiffCount=(`diff $file $BackDir/$DiffFile | wc`)
			else
				DiffCount=(1)
			fi
			if [ $DiffCount != 0 ]; then
				cp -vp $file $BackDir/$BackFile
			else
				echo " Backup has already done."
			fi
		fi
		((Ind++))
	done
}

check_options(){
usage_msg="\
Usage: $0 [options] files

Options:
  -h		show this help
  -d dir	select TargetDir
  -c		make backups at current directory
"
	
	TargetDir=""
	while getopts hd:c option
	do
		case "$option" in
		h)
			echo "$usage_msg"
			exit 0
			;;
		d)
			TargetDir="$OPTARG"
			if [ -d "$OPTARG" ]; then
				echo "TargetDir = $OPTARG" 
			else
				echo "$OPTARG does not exist."
				exit 1
			fi
			;;
		c)
			TargetDir="."
			;;
		\?)
			echo "Usage: $0 [-h] [-d dir] files" 1>&2
			exit 1;;
		esac
	done
	shift `expr "$OPTIND" - 1`
	ArgFiles=($@)
	if [ ${#ArgFiles} = 0 ];then
		echo "$usage_msg"
		exit 1
	fi
	if [ -d "$TargetDir/Back" ]; then
		TargetDir="$TargetDir/Back"
	elif [ -d "$TargetDir/back" ]; then
		TargetDir="$TargetDir/back"
	elif [ -d "$TargetDir/BACK" ]; then
		TargetDir="$TargetDir/BACK"
	else
		TargetDir="$TargetDir"
	fi
}

check_BackDir(){
	file="$1"
	if [ ! -f "$file" ];then
		echo "$file does not exist"
		check=1
		return
	fi
	slash_count=`echo $file | grep -c "/"`
	if [[ $slash_count != 0 ]]; then
		FileDir="${file%/*}"
	else
		FileDir="."
	fi
	FileName="${file##*/}"
	BackDirName="${FileName}.dir"
	if [ "$TargetDir" = "" ];then
		if [ -d "$FileDir/Back" ]; then
			BackDir="$FileDir/Back/$BackDirName"
		elif [ -d "$FileDir/back" ]; then
			BackDir="$FileDir/back/$BackDirName"
		elif [ -d "$FileDir/BACK" ]; then
			BackDir="$FileDir/BACK/$BackDirName"
		else
			BackDir="$FileDir/$BackDirName"
		fi

	else
		BackDir="$TargetDir/$BackDirName"
	fi
	mkdir_idne $BackDir
	check=0
}

mkdir_idne(){
	if [ ! -d $1 ]; then
		mkdir $1
		echo "---> $1 was created."
	fi
}

backer $@

おすすめソフト