Shell 对整个文件夹中的文件进行MD5校验 [转]

查看本地文件的 MD5 命令:md5sum FileName
查看home目录下所有文件的 MD5 码:
cd ~
find /home -type f -print0 | xargs -0 md5sum | sort >md5.txt
查看当前目录下所有文件的 MD5 码:
find ./ -type f -print0 | xargs -0 md5sum | sort >md5.txt

通过上述方法对 home 文件夹里数据生成一份 md5 校验文件
这个 md5 文件就这可作为这个 home 文件夹的校验文件,校验一个文件夹数据是否和 home 目录相同的方法就是针对该文件夹通过同样的方法生成一份 md5 校验文件,然后比对校验文件是否相同,如果两个文件相同,这认为这两个比对的数据文件夹一致

当服务器数量增多,无法通过命令对服务器一台台做MD5校验
下面的Shell脚本是脚本生成MD5文件。

#!/bin/bash
# author: Jerry.huang

# Set environment variables
LANG=""
export LANG

echo ""
echo ""
echo "please put check_file in the same directory?"
echo ""
read -p "are you put the check_file in the right position ? (Y/N): " select_yn
echo ""
echo ""

if [ "$select_yn" == "Y" ] || [ "$select_yn" == "y" ]; then

    echo "start generate data.md5 ..."
    cd ./data
    find ./ -type f -print0 | xargs -0 md5sum | sort > ../data.md5
    echo "generate md5 value over"

elif [ "$select_yn" == "N" ] || [ "$select_yn" == "n" ]; then 
    echo "stop generate md5 value !"
else
    echo "I don't know what your choice is !!!"
fi

20230808 update

#!/bin/bash
# 定义要遍历的目录列表
directories=( "/mnt/webnas/html/pc" "/mnt/webnas/html/mobile" )

# 定义md5目录
md5_data="/opt/md5" && mkdir -p ${md5_data}

# 目录最后一个目录不能相同,作为项目名使用
# 遍历目录列表检查文件Md5是否正常
for dir in "${directories[@]}"; do
    md5_src=${md5_data}/md5_${dir##*/}.txt.src 
    md5_new=${md5_data}/md5_${dir##*/}.txt.new 
    md5_src_file=${md5_data}/src_${dir##*/}.txt
    md5_new_file=${md5_data}/new_${dir##*/}.txt 
    result=${md5_data}/result_${dir##*/}.txt
    # 当MD5文件不存在时,生成MD5文件
    if [ -d "${dir}" ] && [ ! -e ${md5_src} ]; then
        # 创建测试文件
        # echo abc > ${dir}/test.txt && echo abcd > ${dir}/test2.txt 
        find ${dir} -type f -exec md5sum {} + | sort > ${md5_src}
    fi
    # # 测试更新文件
    # echo abc >>  ${dir}/test.txt 
    # # 测试删除文件 
    # rm -f ${dir}/test2.txt  
    # # 测试新增文件
    # echo abc >>  ${dir}/test3.txt 

    # 检查时生成当前MD5
    find ${dir} -type f -exec md5sum {} + | sort > ${md5_new}

    # 排序获取文件清单
    awk -F " " '{print $2}' ${md5_new} | sort  > ${md5_new_file}
    awk -F " " '{print $2}' ${md5_src} | sort  > ${md5_src_file}

    new=`comm -23  ${md5_new_file}  ${md5_src_file} | wc -l`
    del=`comm -23  ${md5_src_file}  ${md5_new_file} | wc -l`
    update=`md5sum -c ${md5_src} 2>/dev/null | grep FAILED | grep -v 'FAILED open or read' | wc -l`
    # echo $new $del $update
    
    echo "" > ${result}
    # 新增文件
    if [ ${new} -gt 0 ];then
        echo "[项目${dir}新增${new}文件]" >> ${result}
        comm -23  ${md5_new_file}  ${md5_src_file} >> ${result} 
    fi 
    # 删除文件
    if [ ${del} -gt 0 ];then
        echo "[项目${dir}删除${del}文件]" >> ${result}
        comm -23  ${md5_src_file}  ${md5_new_file} >> ${result}
    fi
    # 获取更新的文件
    if [ ${update} -gt 0 ];then
        echo "[项目${dir}更新${update}文件]" >> ${result}
        md5sum -c ${md5_src} 2>/dev/null | grep FAILED | grep -v 'FAILED open or read' | awk -F ":" '{print $1}' >> ${result}
    fi
    # 检查完更新原始md5文件
    find ${dir} -type f -exec md5sum {} + | sort > ${md5_src} 
    number=`cat ${result} | wc -l`
    if [ ${number} -gt 1 ];then
        cat ${result}
        python3 ${md5_data}/send_fs.py "`cat ${result} | grep -v "^$" | sed -e 's/ //g' -e 's/\t/|/g' | sed ':a;N;$!ba;s/\n/\\\\\n/g'`" >/dev/null 
    fi
done
posted @ 2015-07-03 15:06  Mr黄瑞  阅读(12221)  评论(0编辑  收藏  举报