Shell脚本删除B文件夹内A不存在的txt文件修复求助
原脚本错误原因
- 路径判断逻辑错误:
-f是用于判断普通文件的参数,你输入的是文件夹路径,应该改用-d判断路径是否为存在的目录 - 文件名对比逻辑完全错误:直接用
$filePath/*.txt != $filePath2/*.txt的写法无法批量对比两个目录下的文件名,shell会先把通配符展开成所有匹配的文件名列表,不能直接用等于/不等于符号判断 - 删除逻辑错误:循环内直接执行
rm -rf $filePath2/*.txt会直接删除B目录下所有txt文件,完全不符合「只删除A中不存在的文件」的需求 - 变量没有加双引号,遇到带空格的路径会直接报错
正确实现脚本
#!/bin/bash # 读取两个目录路径 echo "请输入第一个文件夹路径(A,作为参照的目录):" read -r filePath echo "请输入第二个文件夹路径(B,需要清理冗余文件的目录):" read -r filePath2 # 先校验两个路径都是存在的目录 if [[ ! -d "$filePath" || ! -d "$filePath2" ]]; then echo "错误:输入的其中一个或两个路径都不是存在的有效目录" exit 1 fi # 遍历B目录下所有txt文件 for b_file in "$filePath2"/*.txt; do # 跳过B目录下没有匹配到txt文件的情况 [[ -e "$b_file" ]] || continue # 取当前文件的纯文件名(去掉前面的路径前缀) filename=$(basename -- "$b_file") # 判断A目录下是否存在同名文件 if [[ ! -f "$filePath/$filename" ]]; then # 不存在就删除B下的这个冗余文件 echo "正在删除A目录不存在的文件:$b_file" rm -f -- "$b_file" fi done echo "清理完成,$filePath2 目录下仅保留了两个目录共有的文件"
逻辑说明
- 先对输入的两个路径做合法性校验,确保都是存在的目录
- 逐个遍历B目录下的txt文件,提取纯文件名后去A目录下查找是否存在同名文件
- 仅删除A中不存在的B目录下的文件,不会误删共有文件
- 所有变量都加了双引号,兼容带空格的路径,加了
--避免文件名以-开头时报错
内容的提问来源于stack exchange,提问作者Mallikarjun
相关产品推荐
相关产品推荐

