脚本功能 对比文件夹里文件差异,并生成tar包的增量备份包
#! /bin/bash ############################################################ # # Date: 2022/06/24 # # 脚本功能: # 对比两个文件夹差异。 # 对比${new_folder}文件夹比${old_folder}文件, # 修改或更新了什么文件,方式是计算文件md5值,对比。 # ############################################################ name_time=`date +%Y-%m-%d_%H%M%S` tar_bak_file_name=diff_folder_bak_${name_time}.tar.gz ## 要对比的文件夹 old_folder=/home/ZXL_bak new_folder=/home/zxl ## MD5值生成对比的临时文件 old_md5_file_name=old_f_md5.txt new_md5_file_name=new_f_md5.txt md5_list=md5_list.txt ## tar打包文件列表 tar_file_list=tar_file_list.txt ## 清理上一次的结果 if [ -f ${tar_bak_file_name} ];then echo " " echo "[ INFO ] mv ${tar_bak_file_name} 11History/" mv ${tar_bak_file_name} 11History/ echo " " fi if [ -f ${old_md5_file_name} ];then echo " " echo "[ INFO ] rm -f ${old_md5_file_name} " \rm -f ${old_md5_file_name} fi if [ -f ${new_md5_file_name} ];then echo "[ INFO ] rm -f ${new_md5_file_name}" \rm -f ${new_md5_file_name} fi echo " " ##防止在for循环时带空格文件被当成两个文件,修改IFS默认分割 old_IFS=$IFS IFS=$(echo -en "\n\b") ## 遍历目录生成md5值 echo "[ INFO ] md5sum ${old_folder}" for old_f in `find ${old_folder%/} -type f` do md5sum "${old_f}" >>${old_md5_file_name} done echo "[ INFO ] md5sum ${new_folder}" for new_f in `find ${new_folder%/} -type f` do md5sum "${new_f}" >>${new_md5_file_name} done ##还原IFS IFS=${old_IFS} echo " " ## 对比新旧文件MD5值,获取新增或修改过的文件MD5值 echo "[ INFO ] cat ${new_md5_file_name}| awk '{print \$1}'| grep -v \"\`cat ${old_md5_file_name}| awk '{print \$1}'\`\" > ${md5_list}" cat ${new_md5_file_name}| awk '{print $1}'| grep -v "`cat ${old_md5_file_name}|awk '{print $1}'`" > ${md5_list} ## 生成要打包的tar文件列表 echo "[ INFO ] cat ${new_md5_file_name}| grep \"cat ${md5_list}\"| awk '{print \$NF}'| grep -v \"zxl/.\" > ${tar_file_list}" cat ${new_md5_file_name}| grep "`cat ${md5_list}`"| awk '{print $NF}'| grep -v "zxl/\." > ${tar_file_list} ##统计要打包文件数量 echo "[ INFO ] wc -l ${tar_file_list} " wc -l ${tar_file_list}| awk '{print $1}' echo " " ## 根据${tar_file_list}列表文件打包 count=`wc -l ${tar_file_list}| awk '{print $1}'` if [ ${count} = 0 ];then echo "[ Warrning ] No files to back up." echo " " ## 清理垃圾 echo "[ INFO ] \rm -f ${old_md5_file_name} ${new_md5_file_name} ${md5_list} ${tar_file_list} " \rm -f ${old_md5_file_name} ${new_md5_file_name} ${md5_list} ${tar_file_list} echo " " exit else echo "[ INFO ] tar -P -zcf ${tar_bak_file_name} -T ${tar_file_list} --exclude=*.jar --exclude=11History --exclude=file_Agent15000_install/*tar*" tar -P -zcf ${tar_bak_file_name} -T ${tar_file_list} --exclude=*.jar --exclude=11History --exclude=file_Agent15000_install/*tar* fi echo " " ## 清理垃圾 echo "[ INFO ] \rm -f ${old_md5_file_name} ${new_md5_file_name} ${md5_list} ${tar_file_list} " \rm -f ${old_md5_file_name} ${new_md5_file_name} ${md5_list} ${tar_file_list} echo " " ## 复制新修改的到备份目录,等待下次对比 echo "[ INFO ] cp -ar ${new_folder}/* ${old_folder}" cp -ar ${new_folder}/* ${old_folder} echo "[ INFO ] mv ${old_folder}/${tar_bak_file_name} ${old_folder}/11History/" mv ${old_folder}/${tar_bak_file_name} ${old_folder}/11History/ echo " " ## 列出打包好的文件 ls -lh --color=auto ${tar_bak_file_name}
一、报错:tar 报错 Removing leading ‘/‘ from member names
原因:打包路径中有‘/’根路径,tar默认是以相对路径打包的。
解决方法:
打包时加上-P参数,以绝对路径打包。
二、报错:tar: Options `-[0-7] [lmh]' not supported by *this* tar
原因:有些文件名带有空格,在脚本里for循环时空格被当成分割符,
刚好文件名空格后是-,在打包时-开头被tar解释称参数,所以报错。
解决方法:
将文件名中的空格去掉。
linux用rename命令,可以批量修改。
文件名里有多个空格要多次执行rename命令才能全部替换完。
参考:
https://www.jianshu.com/p/5db41a2a1c05