编写Bash脚本检测路径下新增目录 基于diff比对实现后续操作
修复后的Bash脚本实现目录新增检测
原有代码问题梳理
- 首行shebang语法错误,正确格式为
#!/bin/sh或#!/bin/bash - 生成新文件列表时使用追加符
>>,导致每次运行都会累加历史数据,比对结果完全失效 diff输出的处理逻辑错误,cut指定的分隔符为空,无法正确提取新增目录名- 未过滤普通文件,会把新增的普通文件也识别为匹配结果,不符合仅检测文件夹的需求
- 未处理历史记录文件首次运行不存在的场景,首次执行会报错
- 运行结束后未更新历史记录文件,下次比对仍会使用旧的基准数据
可直接运行的完整脚本
#!/bin/bash # 定义要检测的根目录 BASEDIR="/tmp/" # 定义历史记录文件存储路径,可自行修改到非/tmp路径避免系统重启后丢失 OLD_RECORD="/opt/dir_check/old_dirs.txt" NEW_TMP="/opt/dir_check/new_dirs.tmp" # 预创建存储目录避免报错 mkdir -p "$(dirname "$OLD_RECORD")" # 进入目标目录避免路径拼接错误 cd "$BASEDIR" || exit 1 # 生成当前所有文件夹列表,仅统计目录,忽略普通文件、不需要隐藏目录可把ls -A改为ls ls -A -F | grep '/$' | sed 's/\/$//' > "$NEW_TMP" # 首次运行无历史记录时初始化后直接退出 if [ ! -f "$OLD_RECORD" ]; then mv "$NEW_TMP" "$OLD_RECORD" exit 0 fi # 比对两个列表,提取新增的文件夹 DIRDIFF=$(diff "$OLD_RECORD" "$NEW_TMP" | grep '^>' | cut -d ' ' -f 2-) # 遍历新增文件夹执行自定义操作 for dir in $DIRDIFF do if [ -d "$BASEDIR$dir" ]; then # 此处替换为你需要执行的操作,当前仅打印新增目录名 echo "新增目录:$dir" fi done # 更新历史记录用于下次比对 mv "$NEW_TMP" "$OLD_RECORD"
额外说明
- 如果需要保留历史记录不被系统清理,可将
OLD_RECORD和NEW_TMP的存储路径修改到非临时目录 - 若目录名包含空格,可将
for循环替换为while read循环处理,避免断词错误
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

