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,执行仍有此异常,则找其他方法处理