Skip to content

Instantly share code, notes, and snippets.

@nobucshirai
Last active May 8, 2021 06:55
Show Gist options
  • Save nobucshirai/6883007 to your computer and use it in GitHub Desktop.
Save nobucshirai/6883007 to your computer and use it in GitHub Desktop.
A simple backup script.
#!/bin/bash
# AUTHOR
# 2013/10/08 Nobu C. Shirai
# 2018/10/06 Akira Hasegawa
description='
Creating backup files in the arguments in each backup directory.
The name of each backup file with backup directory is
"org_filename.dir/X_org_filename" where "X" is the index number
of backups which starts from 0.
In the case that there is a directory named "back" in the current
directory (or in the specified directory by "-d" option),
the backup file is created under back/org_filename.dir/.
'
backer(){
check_options $@
Ind=1
for TargetFile in ${ArgFiles[@]}
do
echo "[${Ind}] $TargetFile"
if [[ ! -f "$TargetFile" ]]; then
echo "$TargetFile does not exist"
break
fi
setBackDir "$TargetFile"
# Set NewBackFile and OldBackFile
prefix_no="$(( $( find "${BackDir}" -regex ".*/[0-9][0-9]*_${FileName}" | wc -l ) ))"
NewBackFile="${prefix_no}_${FileName}"
OldBackFile=""
if (( $prefix_no != 0 )); then
OldBackFile="$(( prefix_no - 1 ))_${FileName}"
fi
# Backup TargetFile as $BackDir/$NewBackFile
diff -q "$TargetFile" "$BackDir/$OldBackFile" 1>/dev/null 2>&1
if (( $? != 0 )); then
cp -vp "$TargetFile" "$BackDir/$NewBackFile"
else
echo " This file had already backuped. ($OldBackFile)"
fi
((Ind++))
done
}
check_options(){
usage_msg1="\
Usage: $0 [options] files
"
usage_msg2="\
Options:
-h show this help
-d dir select PATH to backup (default is current directory)
-c make backups at current directory
"
TargetDir=""
while getopts hd:c option
do
case "$option" in
h)
echo "$usage_msg1""$description""$usage_msg2"
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_msg1""$usage_msg2"
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
}
setBackDir(){
file="$1"
slash_count=`echo $file | grep -c "/"`
if (( $slash_count != 0 )); then
FileDir="${file%/*}"
else
FileDir="."
fi
FileName="${file##*/}"
BackDirName="${FileName}.dir"
if [[ -z "$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
}
mkdir_idne(){
if [[ ! -d $1 ]]; then
mkdir $1
echo "---> $1 was created."
fi
}
backer $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment