Linux复制目录对比MD5并且删除源文件脚本

其实直接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一起使用,适合多文件转盘

Sitemap · Rss

津ICP备2021004480号-3