作者前言:
今天也是接到老板发布的第一个写代码的任务,就是脚本。
看我接下来如何和老板周旋操作。
Diff 任务需求:
写一个 shell脚本, 比较old 和 new两个目录的差异,并将差异按路径拷贝出来
1. new目录相对于old目录,所改变的文件,增加的文件,按照原路径全部都拷贝出来。
2. 忽略 new 和 old 中的链接文件。
3. 目的是只做增量升级包。
#!/bin/bash
# 获取脚本所在的位置
workdir=$(cd $(dirname $0) && pwd || pwd)
cd $workdir
dir1="${workdir}/old"
dir2="${workdir}/new"
list1=$(cd ${dir1} && find . -type f)
list2=$(cd ${dir2} && find . -type f)
# 给定一个记录日志的文件夹
outLog="./output.log"
rm -f ${outLog:-null}
diffPath="${workdir}/changed"
mkdir -p "${diffPath}"
# for 循环 new 目录中的文件
for file in ${list2}; do
# 对比 new 的文件 是否在 old目录中
oldfilepath=$(echo "${list1}" | grep "^${file}$")
# 如果 不存在
if [[ -z "${oldfilepath}" ]]; then
# 判断是否在 diff目录已经存在,如果不存在
if [ ! -f "${diffPath}/${file}" ]; then
# 输出 日志 并拷贝到目录文件中
echo "${file}缺少" | tee -a "${outLog}"
# 使用了shell模式进行cd拷贝,避免目录层级的问题
(cd ${dir2} && cp -f --parents "${file}" "${diffPath}")
fi
else
# 如果已经存在,获取 old, new 目录的MD5值
oldMD5=$(md5sum "${dir1}/$oldfilepath" | cut -d " " -f1)
newMD5=$(md5sum "${dir2}/$file" | cut -d " " -f1)
diffMD5=$(md5sum "${diffPath}/$file" 2>/dev/null | cut -d " " -f1)
# 三个 MD5进行对比,都不一致的,输出日志并且拷贝
if [[ "${oldMD5}" != "${newMD5}" ]]; then
if [[ "${newMD5}" != "${diffMD5}" ]]; then
echo "${file}发生变化" | tee -a "${outLog}"
diff -u ${dir1}/$oldfilepath ${dir2}/$file
(cd ${dir2} && cp -f --parents "${file}" "${diffPath}")
fi
fi
fi
done