【问题标题】:bash script that delete file according to date in file name根据文件名中的日期删除文件的bash脚本
【发布时间】:2014-05-16 21:30:26
【问题描述】:

我正忙于编写一个 bash 脚本,该脚本可以根据文件名中的日期删除文件,例如 xxxxxxxxx140516.log。它应该在 2014 年 5 月 16 日之后的第二天删除文件。我希望脚本从字符 25 读取文件,因为这是开始日期,它应该定期检查是否有任何旧文件。当前我的脚本如下所示:

#!/bin/bash 
rm *$(date -d "-1 day" +"%y%m%d")*

这个脚本的问题是,如果计算机有几天没有启动和运行,它不会删除超过日期的旧文件,也不会从字符 25 开始。请帮助,谢谢

【问题讨论】:

  • 我不知道在 xxxxxxx 中有什么可能性,但我会将最后一个 * 替换为 .log 以避免意外删除在 xxxxxx 中某处具有相同日期字符串的文件。

标签: bash rm


【解决方案1】:
for day in {1..7}; do
    rm -f ????????????????????????$(date -d "-$day day" +"%y%m%d").log
done

这将允许脚本最多运行一周;您可以更改范围以处理更长的时间段。

通配符中有 24 个 ? 字符,因此它会查找从字符 25 开始的日期。

-f 选项可防止rm 在未找到匹配文件时打印错误消息。 警告:如果您没有文件的写入权限,它还会阻止它要求确认。

符号{start..end} 扩展为从startend 的数字序列,因此{1..10} 将是1 2 3 4 5 6 7 8 9 10 的缩写。您还可以使用{char1..char2} 来获取字符序列,例如{a..d}a b c d 的缩写。

【讨论】:

  • 嗨 Barmar,什么是:' 代表 {1..7} 中的一天; do ' 我对 bash 有点陌生,谢谢
  • 我添加了大括号符号的解释。
【解决方案2】:

如果需要,您可以使用这些文件的时间戳清除这些日志文件,如下所示:

find <path_to_logs_dir> -mtime +0 -exec rm {} \;

上述命令将清除所有早于今天的文件。请注意,此命令并不专门查找任何格式的日志文件。我这里只是假设日志目录只包含日志文件。

您还可以过滤掉日志文件,如下所示 ->

find <path_to_logs_dir> -name "*.log" -type f -mtime +0 -exec rm {} \;

"-type f" 确保它只列出文件而不是目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多