#!/bin/bash
# 定义两个目录
# 目录地址自行修改
dir_root="/root"
dir1="/root/test1"
dir2="/root/test2"
# 使用find列出两个目录中的文件名,并通过sort排序,然后通过comm找出不同的文件名
diff_in_dir1=$(find "$dir1" -type f -printf '%f\n' | sort)
diff_in_dir2=$(find "$dir2" -type f -printf '%f\n' | sort)
# -comm -23 将显示只在第一个文件(dir1)中出现的行
# -comm -13 将显示只在第二个文件(dir2)中出现的行
unique_in_dir1=$(comm -23 <(echo "$diff_in_dir1") <(echo "$diff_in_dir2"))
unique_in_dir2=$(comm -13 <(echo "$diff_in_dir1") <(echo "$diff_in_dir2"))
# 显示只在 dir1 中存在的文件
echo -e "\033[31m只在 $dir1 中存在的文件:\033[0m\n\033[44;33m$unique_in_dir1\033[0m"
# 显示只在 dir2 中存在的文件
echo -e "\033[31m只在 $dir2 中存在的文件:\033[0m\n\033[44;33m$unique_in_dir2\033[0m\n"
# 创建两个数组来存储不同文件的完整路径
files_in_dir1=()
files_in_dir2=()
# 遍历 dir1 中独有的文件,并获取它们的完整路径
for file in $unique_in_dir1; do
full_path=$(find "$dir_root" -name "$file" -type f)
if [ -n "$full_path" ]; then
files_in_dir1+=("$full_path")
fi
done
# 遍历 dir2 中独有的文件,并获取它们的完整路径
for file in $unique_in_dir2; do
full_path=$(find "$dir_root" -name "$file" -type f)
if [ -n "$full_path" ]; then
files_in_dir2+=("$full_path")
fi
done
echo -e "\033[33m################################\033[0m\n\n"
# 打印数组的内容
echo -e "\033[31m只在 $dir1 中的文件路径:\033[0m\n\033[44;33m${files_in_dir1[@]}\033[0m"
echo -e "\033[31m只在 $dir2 中的文件路径:\033[0m\n\033[44;33m${files_in_dir2[@]}\033[0m"
read -p "确认继续下面的操作吗(y/n)?" check_sure
tasks (){
dir1_num=$(ls -1rt $dir1 | wc -l)
dir2_num=$(ls -1rt $dir2 | wc -l)
if [ "${dir1_num}" -gt "${dir2_num}" ];then
read -p "确定将$dir1目录差集的文件补到$dir2目录中吗(y/n)? " sure
case "$sure" in
Y|y)
for i in "${files_in_dir1[@]}";do
cp -a $i $dir2
done
echo -e "\033[32m您已将$dir1目录差集的文件补录到$dir2目录中!\033[0m"
;;
N|n)
echo -e "\033[32m您没有执行差集补录操作,现已退出!\033[0m"
exit 112
;;
*)
echo -e "\033[32m您输入有误,如需要,请重新运行脚本!\033[0m"
exit 113
;;
esac
elif [ "${dir1_num}" -lt "${dir2_num}" ];then
read -p "确定将$dir2目录差集的文件补到$dir1目录中吗(y/n)? " sure
case "$sure" in
Y|y)
for i in "${files_in_dir2[@]}";do
cp -a $i $dir1
done
echo -e "\033[32m您已将$dir2目录差集的文件补录到$dir1目录中!\033[0m"
;;
N|n)
echo -e "\033[32m您没有执行差集补录操作,现已退出!\033[0m"
exit 114
;;
*)
echo -e "\033[32m您输入有误,如需要,请重新运行脚本!\033[0m"
exit 115
;;
esac
elif [ "$dir1_num" -eq "$dir2_num" ];then
echo -e "\033[36m$dir1和$dir2目录的文件数量一致,不需要补录!\033[0m"
fi
}
case "$check_sure" in
Y|y)
tasks
;;
N|n)
echo -e "\033[33m您已退出!\033[0m"
exit 116
;;
*)
echo -e "\033[33m输入错误!\033[0m"
exit 117
;;
esac
觉得有帮助可以投喂下博主哦~ 一分也是爱!感谢!
转载请注明文章地址及作者哦~