• Linux shell文件夹对比文件MD5值不同


    脚本功能 对比文件夹里文件差异,并生成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

    https://www.cnblogs.com/zhanggaofeng/p/15643008.html

    https://blog.csdn.net/whatday/article/details/112094813

  • 相关阅读:
    requirejs
    fontresize 移动端的手机字体 大小设置
    css 设置字体
    nodejs javascript微信开发
    多个倒计时
    pure.css 学习记录
    【转】JMeter学习(五)检查点(断言)
    【转】JMeter学习(四)参数化
    【转】JMeter学习(三)元件的作用域与执行顺序
    [转]JMeter学习(二)录制脚本
  • 原文地址:https://www.cnblogs.com/wutou/p/16411068.html
Copyright © 2020-2023  润新知