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

 

posted @   悟透  阅读(1269)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示