如何检查bash文件是否超过x时间创build?

我想在linux bash中检查一个文件是否超过x时间创build的。

假设文件名为text.txt,时间为2小时。

if [ what? ] then echo print "old enough" fi 

只适用于修改时间

 if test `find "text.txt" -mmin +120` then echo old enough fi 

或者,在一行中也是一样的:

 #!/bin/bash find text.txt -mmin +120 -exec echo "old enough" \; 

您可以使用-cmin进行更改,或使用-amin进行访问。 正如其他人指出,我不认为你可以跟踪创作时间。

我总是喜欢用date -r /the/file +%s来查找它的年龄。

你也可以touch --date '2015-10-10 9:55' /tmp/file来获得任意date/时间的非常精细的时间。

创build时间不存储。

存储的是三个时间戳(通常,可以在某些文件系统上或通过某些文件系统选项closures):

  • 上次访问时间
  • 上次修改时间
  • 上次更改时间

对文件的“更改”被视为权限更改,重命名等,而修改仅为内容。

尽pipectime在技术上并不是创build的时间,但通常是这样。

由于ctime不受文件内容更改的影响,通常只有在创build文件时才会更新。 是的 – 我可以听到你所有尖叫 – 如果你改变访问权限或所有权,它也会被更新…但通常这是一次,通常是在你把文件放在那里。

就个人而言,我总是使用mtime来处理所有事情,而且我想象的是你想要的。 但无论如何…这是一个Guss的“不吸引人的”bash,在一个易于使用的functionrehash。

 #!/斌/庆典
函数age(){
   本地文件名= $ 1
    local changed =`stat -c%Y“$ filename”`
   本地现在=`date+%s`
   本地过去了

   让elapsed = now改变
    echo $ elapsed
 }

文件= “/”
 echo $文件的年龄是$(age“$ file”)秒。

使用stat来计算文件的最后修改date, date出当前时间和自由使用bashisms,可以根据文件的最后修改时间1来做testing。

 if [ "$(( $(date +"%s") - $(stat -c "%Y" $somefile) ))" -gt "7200" ]; then echo "$somefile is older then 2 hours" fi 

虽然代码的可读性稍差一点,但是我认为它是一个更好的方法,然后运行find来查看已经“find”的文件。 另外,date操作很有趣;-)


  1. 正如菲尔正确地指出创build时间不logging,但使用%Z而不是下面的%Y来获得“更改时间”,这可能是你想要的。

[更新]

对于mac用户,使用stat -f "%m" $somefile而不是上面的Linux特定语法

find一个是好的,但我认为你可以用另一种方式,尤其是如果你现在需要多less秒的文件旧的

date -d "now - $( stat -c "%Y" $filename ) seconds" +%s

使用GNUdate

考虑工具“统计”的结果:

  File: `infolog.txt' Size: 694 Blocks: 8 IO Block: 4096 regular file Device: 801h/2049d Inode: 11635578 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ fdr) Gid: ( 1000/ fdr) Access: 2009-01-01 22:04:15.000000000 -0800 Modify: 2009-01-01 22:05:05.000000000 -0800 Change: 2009-01-01 22:05:05.000000000 -0800 

您可以在这里看到访问/修改/更改的三个date。 没有创builddate。 只能确定文件内容何时被修改(“修改”字段)或其inode已更改(“更改”字段)。

两个字段都更新时的示例:

如果有人将额外的信息连接到文件的末尾,“修改”将被更新。

如果有人通过chmod更改权限,“更改”将被更新。