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
Learn how to learn~~