Linux复制目录对比MD5并且删除源文件脚本
🕙2023-05-03
其实直接cp就好了,感觉有点多此一举
第一个版本:
#!/bin/bash
# 检查参数是否存在
if [ $# -ne 2 ]; then
echo "Usage: $0 source_dir destination_dir"
exit 1
fi
# 设置源目录和目标目录
source_dir=$1
destination_dir=$2
# 复制源目录下的所有文件和文件夹到目标目录
rsync -a --progress "$source_dir/" "$destination_dir/"
# 获取目标目录下的所有文件的MD5值,并保存到一个文件中
cd "$destination_dir"
find . -type f -print0 | xargs -0 md5sum > /tmp/b_md5.txt
# 循环源目录下的所有文件,比较它们在源目录和目标目录中的MD5值
for file in "$source_dir"/*
do
# 获取文件名
filename=$(basename "$file")
# 如果文件在目标目录中不存在,跳过此文件
if [ ! -f "$destination_dir/$filename" ]; then
continue
fi
# 计算文件在源目录中的MD5值
md5_a=$(md5sum "$file" | awk '{ print $1 }')
# 从/b_md5.txt中获取文件在目标目录中的MD5值
md5_b=$(grep "$filename" /tmp/b_md5.txt | awk '{ print $1 }')
# 如果MD5值匹配,删除源目录中的文件
if [ "$md5_a" = "$md5_b" ]; then
rm "$file"
fi
done
# 删除临时文件
rm /tmp/b_md5.txt
第二个版本:
#!/bin/bash
# 检查参数是否存在
if [ $# -ne 2 ]; then
echo "Usage: $0 source_dir destination_dir"
exit 1
fi
# 设置源目录和目标目录
source_dir=$1
destination_dir=$2
# 获取目标目录下的所有文件的MD5值,并保存到一个文件中
cd "$destination_dir"
find . -type f -print0 | xargs -0 md5sum > /tmp/b_md5.txt
# 循环源目录下的所有文件,比较它们在源目录和目标目录中的MD5值
for file in "$source_dir"/*
do
# 获取文件名
filename=$(basename "$file")
# 如果文件在目标目录中不存在,将其移动到目标目录
if [ ! -f "$destination_dir/$filename" ]; then
mv "$file" "$destination_dir"
elif md5sum -c <(echo "$(md5sum "$destination_dir/$filename")") >/dev/null 2>&1; then
rm "$file"
echo "Deleted $filename (exists with matching MD5)"
else
echo "Skipping $filename (already exists with different MD5)"
fi
done
# 删除临时文件
rm /tmp/b_md5.txt
运行参数:
bash cp.sh /source /to
可以搭配nohup一起使用,适合多文件转盘