Linux shell文件夹对比文件MD5值不同
脚本功能 对比文件夹里文件差异,并生成tar包的增量备份包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #! /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
https://www.cnblogs.com/zhanggaofeng/p/15643008.html
https://blog.csdn.net/whatday/article/details/112094813
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!