1 changed files with 138 additions and 0 deletions
@ -0,0 +1,138 @@
|
||||
#!/bin/bash |
||||
|
||||
|
||||
#full |
||||
full() { |
||||
echo "[full]" |
||||
|
||||
#mark running |
||||
touch ${dst_dir}/running |
||||
|
||||
#max_backups must >= 2 |
||||
[ $max_backups -lt 2 ] && max_backups=2 |
||||
|
||||
#get old_backups |
||||
old_backups=$(ls ${dst_dir}/full | wc -l) |
||||
echo "!$old_backups!" |
||||
|
||||
#delete old backups to max_backups-1 |
||||
while [ ${old_backups} -ge ${max_backups} ] |
||||
do |
||||
oldest_dir=$(ls ${dst_dir}/full | sort -n | head -n 1) #find oldest dir by name |
||||
rm -r ${dst_dir}/full/${oldest_dir} |
||||
rm -r ${dst_dir}/diff/${oldest_dir} |
||||
echo "remove ${oldest_dir}" |
||||
old_backups=$((old_backups-1)) |
||||
done |
||||
|
||||
#create new backup dir |
||||
mkdir ${dst_dir}/full/$(date +"%F") |
||||
mkdir ${dst_dir}/diff/$(date +"%F") |
||||
|
||||
rsync -av $src_dir ${dst_dir}/full/$(date +"%F")/ |
||||
|
||||
rm ${dst_dir}/running |
||||
} |
||||
|
||||
|
||||
#diff |
||||
diff() { |
||||
echo "[diff]" |
||||
|
||||
#mark running |
||||
touch ${dst_dir}/running |
||||
|
||||
#max_backups must >= 2 |
||||
[ $max_backups -lt 2 ] && max_backups=2 |
||||
|
||||
#find newest full dir by name |
||||
newest_full=$(ls ${dst_dir}/full | sort -rn | head -n 1) |
||||
|
||||
#get old_backups |
||||
old_backups=$(ls ${dst_dir}/diff/${newest_full} | wc -l) |
||||
echo "!$old_backups!" |
||||
|
||||
#delete old backups to max_backups-1 |
||||
while [ ${old_backups} -ge ${max_backups} ] |
||||
do |
||||
oldest_dir=$(ls ${dst_dir}/diff/${newest_full} | sort -n | head -n 1) #find oldest dir by name |
||||
rm -r ${dst_dir}/diff/${newest_full}/${oldest_dir} |
||||
echo "remove ${oldest_dir}" |
||||
old_backups=$((old_backups-1)) |
||||
done |
||||
|
||||
#create new backup dir |
||||
mkdir ${dst_dir}/diff/${newest_full}/$(date +"%F_T%H") |
||||
|
||||
rsync -av $src_dir ${dst_dir}/diff/${newest_full}/$(date +"%F_T%H")/ --link-dest=../../../full/${newest_full}/ |
||||
|
||||
rm ${dst_dir}/running |
||||
|
||||
} |
||||
|
||||
|
||||
#init |
||||
init() { |
||||
echo "[init]" |
||||
|
||||
#check src_dir readable |
||||
[ ! -r $src_dir ] && echo "src_dir cannot read" |
||||
|
||||
#check dst_dir writeable |
||||
if [ ! -w $dst_dir ]; then |
||||
echo "dst_dir cannot write" |
||||
else |
||||
#create needed dir |
||||
mkdir ${dst_dir}/full |
||||
mkdir ${dst_dir}/diff |
||||
echo "init ok" |
||||
fi |
||||
} |
||||
|
||||
|
||||
#------------main-------------# |
||||
|
||||
#assign arg to var |
||||
src_dir=$3 |
||||
dst_dir=$4 |
||||
mode=$1 |
||||
max_backups=$2 |
||||
|
||||
#check init only |
||||
if [[ $src_dir == "" ]] || [[ $dst_dir == "" ]] ; then |
||||
echo no src_dir or dst_dir input |
||||
exit 1 |
||||
fi |
||||
|
||||
#set src_dir end without / |
||||
if [[ $src_dir == */ ]]; then |
||||
src_dir=${src_dir%?} |
||||
fi |
||||
#set dst_dir end without / |
||||
if [[ $dst_dir == */ ]]; then |
||||
dst_dir=${dst_dir%?} |
||||
fi |
||||
|
||||
#input debug |
||||
#echo "$mode $src_dir $dst_dir" |
||||
|
||||
#check if other processing running |
||||
if [ -f ${dst_dir}/running ]; then |
||||
echo "other processing running" |
||||
exit 2 |
||||
fi |
||||
|
||||
#mode |
||||
if [ $mode == "full" ]; then |
||||
full |
||||
elif [ $mode == "diff" ]; then |
||||
diff |
||||
elif [ $mode == "init" ]; then |
||||
init |
||||
else |
||||
echo "no mode select" |
||||
#exit 4 |
||||
fi |
||||
|
||||
#debug |
||||
#echo $(ls ${dst_dir}/full | sort -n | head -n 1) |
Loading…
Reference in new issue