Linux 使用脚本删除文件

Linux 使用脚本删除文件

服务器部署了下载文件服务,文件不需要存档,避免占用内存,编写脚本删除60天前下载的文件,包括目录下空文件夹。增加定时任务,每日执行。因为文件都是pdf文件,所以限制了文件类型。

脚本编写

bash 复制代码
#!/bin/bash
TARGET_DIR="/home/file/download"   # 目标目录(根据实际路径修改)
LOG_FILE="/home/file/download/pdf_clean.log"
DRY_RUN=false  # 调试时设为true

# 创建日志目录(如果不存在)
mkdir -p "$(dirname "$LOG_FILE")"

# 核心清理逻辑
{
    echo "===== PDF清理任务启动 ====="
    echo "目标目录: $TARGET_DIR"
    echo "运行时间: $(date)"
    echo "运行模式: $([ "$DRY_RUN" = true ] && echo "测试模式" || echo "正式删除")"
    echo "--------------------------------------"

    # 第一步:删除60天前的PDF文件(含子目录)
    find "$TARGET_DIR" -name "*.pdf" -type f -mtime +60 2>>"$LOG_FILE" | while IFS= read -r file; do
        if [ "$DRY_RUN" = true ]; then
            echo "[测试] 将删除: $file"
        else
            rm -v "$file"
            echo "[删除] $file"
        fi
    done >> "$LOG_FILE"
    
    # 第二步:清理空目录(关键新增逻辑)
    if [ "$DRY_RUN" = true ]; then
        echo "[测试] 将扫描空目录"
    else
        # 查找空目录并删除
        find "$TARGET_DIR" -type d -empty -exec echo "[清理] 删除空目录: {}" \; -exec rmdir -v {} \; 2>> "$LOG_FILE"
    fi

    # 记录完成状态
    echo "======================================"
    echo "任务完成 | $(date)"
    echo "======================================"
} >> "$LOG_FILE" 2>&1

脚本部署

  • 将脚本保存为 clean_pdf.sh
  • 赋予执行权限(root账号):chmod +x clean_pdf.sh

测试验证

bash 复制代码
# 修改脚本属性 
DRY_RUN=true 
# 保存后执行脚本
./clean_pdf.sh
#查看日志
cat pdf_clean.log # 检查预览结果

正式运行

bash 复制代码
# 修改脚本属性 
DRY_RUN=false
# 保存后执行脚本
./clean_pdf.sh
# 确认空目录已被删除
tree /home/file/download

定时任务配置

bash 复制代码
crontab -e  # 编辑cron配置
# 添加以下行(每天凌晨3点执行)
0 3 * * * /bin/bash /home/file/clean_pdf.sh

crontab -l   # 查看定时任务

问题

执行脚本 ./clean_pdf.sh 时提示

-bash: ./clean_pdf.sh:/bin/bash^M:解释器错误: 没有那个文件或目录

原因

脚本在Windows下编辑后,换行符为\r\n(CRLF),而Linux要求\n(LF)。^M(\r的转义表示)导致解释器路径错误

解决方案

使用转义写法(适用于脚本中)

bash 复制代码
sed -i 's/\r$//' clean_pdf.sh

# 验证
cat -v clean_pdf.sh | head -1
# 显示结果不带 ^M 则成功。如果显示结果没有^M,执行仍有此异常,则找其他方法处理
相关推荐
Fleshy数模5 分钟前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a413244710 分钟前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
一只自律的鸡2 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)2 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen2 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
REDcker2 小时前
Linux 文件描述符与 Socket 选项操作详解
linux·运维·网络
蒹葭玉树3 小时前
【C++上岸】C++常见面试题目--操作系统篇(第二十八期)
linux·c++·面试
2501_927773073 小时前
imx6驱动
linux·运维·服务器
hy____1233 小时前
Linux_进程间通信
linux·运维·服务器
郭涤生3 小时前
C++的函数是否可以做到完全覆盖Linux和windows的跨平台
linux·c++·windows