本文目录导读:

#!/bin/bash
# 定时清理无效动态链接脚本
# 功能:扫描指定目录中的符号链接,删除无效(目标不存在)的链接
# 配置区域
SCAN_DIR="/path/to/your/symlinks" # 要扫描的目录(可改为实际路径)
LOG_FILE="/var/log/clean_broken_links.log" # 日志文件路径
DRY_RUN=false # 设为 true 时只输出不删除(测试用)
# 函数:记录日志
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
# 检查扫描目录是否存在
if [ ! -d "$SCAN_DIR" ]; then
echo "错误:目录 $SCAN_DIR 不存在!" >&2
exit 1
fi
log_message "开始扫描目录:$SCAN_DIR"
# 查找无效的符号链接
# 使用 -L 判断符号链接是否损坏(-L 对损坏链接返回 false)
invalid_links=$(find "$SCAN_DIR" -type l ! -exec test -e {} \; -print 2>/dev/null)
if [ -z "$invalid_links" ]; then
log_message "没有发现无效链接。"
else
log_message "发现以下无效链接:"
echo "$invalid_links" | while IFS= read -r link; do
log_message " 正在处理:$link"
if [ "$DRY_RUN" = false ]; then
# 删除无效链接
rm -f "$link"
if [ $? -eq 0 ]; then
log_message " 已删除:$link"
else
log_message " 删除失败:$link"
fi
else
log_message " [测试模式] 将要删除:$link"
fi
done
fi
log_message "清理完成。"
如何使用
-
保存脚本
将上述内容保存为clean_broken_links.sh,并赋予执行权限:chmod +x clean_broken_links.sh
-
修改配置
- 将
SCAN_DIR改为你要检查的实际目录(/usr/local/bin)。 - 可选:调整
LOG_FILE的路径。 - 首次运行时建议设置
DRY_RUN=true,只查看将删除哪些文件而不实际删除。
- 将
-
测试运行
./clean_broken_links.sh
-
设置定时任务(cron)
使用crontab -e添加以下一行(每天凌晨3点执行):0 3 * * * /path/to/clean_broken_links.sh
也可根据需要调整时间(例如每小时执行:
0 * * * *)。
其他说明
- 查找无效链接的原理
使用find -type l找到符号链接,再用! -exec test -e {} \;测试目标是否存在,如果目标不存在,则视为无效链接。 - 日志记录
所有操作均记录到日志文件,方便事后审计。 - 安全提醒
该脚本会直接删除无效符号链接,请确保扫描目录正确,并先以DRY_RUN=true模式验证。
如果你需要更复杂的场景(如递归清理、按时间过滤等),可以在 find 命令中增加参数,
# 只清理7天前失效的链接
find "$SCAN_DIR" -type l ! -exec test -e {} \; -mtime +7 -delete