如何在bash中检查文件是否创建的时间超过x时间?

时间:2009-02-16 09:25:38

标签: linux bash command-line

我想检查linux bash是否创建了一个文件超过x时间。

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

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

8 个答案:

答案 0 :(得分:114)

仅限修改时间

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进行访问。正如其他人指出的那样,我认为你无法追踪创作时间。

答案 1 :(得分:38)

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

你也可以touch --date '2015-10-10 9:55' /tmp/file在任意日期/时间内获得非常细粒度的时间。

答案 2 :(得分:18)

使用stat计算文件的最后修改日期,date以确定当前时间和自由使用bashisms,可以根据需要进行所需的测试文件的最后修改时间 1

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

虽然代码的可读性比find方法稍差,但我认为这是一种更好的方法,然后运行find来查看已经“找到”的文件。此外,日期操作很有趣; - )


  1. 由于Phil正确地指出创建时间未被记录,但使用%Z代替%Y以获得“更改时间”,这可能是您想要的。
  2. <强> [更新]

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

答案 3 :(得分:16)

不存储创建时间。

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

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

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

答案 4 :(得分:13)

虽然ctime在技术上不是创建的时间,但它经常是。

由于ctime不受文件内容更改的影响,因此通常仅在创建文件时更新。是的 - 我可以听到你们都在尖叫 - 如果你改变了访问权限或所有权,它也会更新......但通常情况下这是一次性的,通常是在你把文件放在那里的时候。

我个人总是把mtime用于所有事情,我想这就是你想要的。但无论如何......这里是Guss的“没有吸引力”的重击,这是一个易于使用的功能。

#!/bin/bash
function age() {
   local filename=$1
   local changed=`stat -c %Y "$filename"`
   local now=`date +%s`
   local elapsed

   let elapsed=now-changed
   echo $elapsed
}

file="/"
echo The age of $file is $(age "$file") seconds.

答案 5 :(得分:6)

找到一个很好,但我认为你可以使用另一个,特别是如果你现在需要多少秒的文件

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

使用GNU日期

答案 6 :(得分:3)

考虑工具'stat'的结果:

  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

您可以在此处看到访问/修改/更改的三个日期。没有 创建日期。你只能确定文件内容的时间 修改(“修改”字段)或其inode更改(“更改” 字段)。

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

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

如果有人通过chmod更改了权限,则会更新“更改”。

答案 7 :(得分:0)

我用

file_age() {
    local filename=$1
    echo $(( $(date +%s) - $(date -r $filename +%s) ))
}

is_stale() {
    local filename=$1
    local max_minutes=20
    [ $(file_age $filename) -gt $(( $max_minutes*60 )) ]
}

if is_stale /my/file; then
    ...
fi