153

我是shell脚本的新手,有人可以帮忙吗?我想删除文件夹中从当前日期回溯到 10 天的脚本。脚本如下所示:

2012.11.21.09_33_52.script
2012.11.21.09_33_56.script
2012.11.21.09_33_59.script

该脚本将使用 Crontab 每 10 天运行一次,这就是我需要当前日期的原因。

4

3 回答 3

488

find是此类任务的常用工具:

find ./my_dir -mtime +10 -type f -delete

解释

  • ./my_dir您的目录(替换为您自己的)
  • -mtime +10超过 10 天
  • -type f只有文件
  • -delete没有惊喜。在执行整个命令之前将其删除以测试您的过滤器find

并注意./my_dir存在以避免糟糕的惊喜!

于 2012-11-21T08:54:10.213 回答
20

只需添加上面的 shell 脚本以删除旧文件,但会记录和计算经过的时间

#!/bin/bash

path="/data/backuplog/"
timestamp=$(date +%Y%m%d_%H%M%S)    
filename=log_$timestamp.txt    
log=$path$filename
days=7

START_TIME=$(date +%s)

find $path -maxdepth 1 -name "*.txt"  -type f -mtime +$days  -print -delete >> $log

echo "Backup:: Script Start -- $(date +%Y%m%d_%H%M)" >> $log


... code for backup ...or any other operation .... >> $log


END_TIME=$(date +%s)

ELAPSED_TIME=$(( $END_TIME - $START_TIME ))


echo "Backup :: Script End -- $(date +%Y%m%d_%H%M)" >> $log
echo "Elapsed Time ::  $(date -d 00:00:$ELAPSED_TIME +%Hh:%Mm:%Ss) "  >> $log

代码添加了一些东西。

  • 以时间戳命名的日志文件
  • 指定的日志文件夹
  • find 仅在日志文件夹中查找 *.txt 文件
  • 类型 f 确保您只删除文件
  • maxdepth 1 确保您不输入子文件夹
  • 超过 7 天的日志文件将被删除(假设这是用于备份日志)
  • 注意开始/结束时间
  • 计算备份操作的经过时间...

注意:要测试代码,只需使用 -print 而不是 -print -delete。但是请仔细检查您的路径。

注意:请确保您的服务器时间通过 date-set timezone/ntp 正确设置。另外使用“stat 文件名”检查文件时间

注意:mtime 可以替换为 mmin 以获得更好的控制,因为 mtime 在处理在天的上下文中获取文件的时间戳时会丢弃所有分数(早于 2 天(+2 天)实际上意味着 3 天)

-mtime +$days  --->  -mmin  +$((60*24*$days))
于 2013-07-26T11:57:07.283 回答
9

如果你能负担得起通过文件数据工作,你可以做

find -mmin +14400 -delete
于 2012-11-21T08:50:18.350 回答