【问题标题】:Bash: calculate age of the newest file in directoryBash:计算目录中最新文件的年龄
【发布时间】:2013-01-08 10:49:48
【问题描述】:

我需要一个 bash 脚本来获取给定目录中最新文件的年龄(以小时或秒为单位)。例如:

-rw-r--r-- 1 root root 3.0M 2012-12-31 12:36 2012_12_31_1236_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root 2.8M 2013-01-01 11:33 2013_01_01_1133_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root 2.4M 2013-01-04 14:17 2013_01_04_1417_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root 2.7M 2013-01-05 12:26 2013_01_05_1226_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root  54M 2013-01-06 14:16 2013_01_06_1415_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root 3.7M 2013-01-07 16:42 2013_01_07_1642_redis_dump_encrypted.tgz
-rw-r--r-- 1 root root 3.4M 2013-01-08 12:36 2013_01_08_1236_redis_dump_encrypted.tgz

命令应接受目录路径并返回自创建最新文件 (2013_01_08_1236_redis_dump_encrypted.tgz) 以来经过的秒数。

我需要这个来使用 zabbix 监控最新备份的时间(我想要一个警报,以防备份机制中断)。单线就好了,因为作为zabbix用户参数使用起来更方便,但不是必须的。

谢谢!

【问题讨论】:

  • 为什么要专门写一行?
  • @Brian Agnew,好吧,不是必须的,当然可以是脚本。使用 zabbix 用户参数使用一个衬里更方便。我将编辑问题。

标签: bash backup zabbix


【解决方案1】:

Perl 的救援:

perl -le '$d=shift;chomp($f=(`ls -t $d/*`)[0]);print 24*60*60*-M$f' /path/to/dir

【讨论】:

    【解决方案2】:

    这是旧帖子,但可能对某人有所帮助。

    我使用以下方法来计算文件的时间(以小时为单位)

     echo $(( ( $(date +%s) - $(stat -c %Y filen.name)) / (60*60)  ))
    

    date +%s - 自 1970-01-01 00:00:00 UTC 以来的秒数

    stat -c %Y - 在参数中给出相同的文件

    这在 OS X 和 BSD 上不起作用,stat 没有 -c 选项,但大多数 Linux 发行版应该没问题。

    【讨论】:

      【解决方案3】:

      这可能有点脆弱,但应该以秒为单位返回 $DIR 中最新文件(或目录)的年龄:

      echo $(( $(date +%s) - $(ls -t $DIR | head -1 | xargs stat -f %a -t %s) ))
      

      %s 时间格式是自纪元以来的秒数,因此上面的行获取最新文件的名称(ls -t $DIR | head -1),获取自纪元以来的最后一次访问时间(以秒为单位)(stat -f %a -t %s) ,并从纪元以来的当前时间中减去它。

      【讨论】:

      • 感谢您的回答。但这就是我得到的: stat: cannot read file system information for %a': No such file or directory stat: cannot read file system information for %s': No such file or directory -bash: 1357643612 - 2013_01_08_1236_redis_dump_encrypted: value too large for base (error token is "2013_01_08_1236_redis_dump_encrypted")
      • 看起来您可能有额外的' 字符?先试试stat -f %a -t %s 2013_01_08_1236_redis_dump_encrypted.tgz,确认stat本身是否有效。
      【解决方案4】:

      这将返回以秒为单位的年龄和文件名。

      stat -c "%Y %n" -- * | sort -rn | awk -v d=$(date +%s) 'NR==1 {print (d-$1), $2; exit}'
      

      【讨论】:

        【解决方案5】:
        # If no files less than 5 minutes old are found, print a 1. Otherwise print a 0.
        if [[ -z $(find $PATH -type f -mmin -5 2>/dev/null) ]]; then echo "1"; else echo "0"; fi
        

        这对于单行来说非常干净!在您需要发送命令行参数的那一刻,您需要.. 一个程序! G0T0 10 FTW!!!!!1!!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-04
          • 2012-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-28
          • 2016-03-20
          • 2011-04-16
          相关资源
          最近更新 更多