You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:54:03