如何检查bash文件是否已创建超过x次?


106

我想检查linux bash文件是否已创建超过x次。

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

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

Answers:


138

仅用于修改时间

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

您可以使用-cmin更改或-amin访问时间。正如其他人指出的那样,我认为您无法跟踪创建时间。


3
您可以删除“测试”和反引号。这类似于'if(test == true)'vs'if(test)'
枪枝

2
没错 我想我是find在找不到匹配项时返回非零值。
枪炮

4
您可以放下反引号,并进行是否测试$(find text.txt -mmin +120)
tommy.carstensen 2013年

1
@BroSlow看起来更好:不可能有 “多个”。当然,text.txt假定不是目录。
kmkaplan 2014年

2
我更喜欢这种语法:[ "$(find path/to/file -mmin +120)" ] && echo "it is old"
Alfe

42

我一直喜欢用它date -r /the/file +%s来寻找年龄。

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


我今天在找同样的东西。最好!
Umair A. 2014年

谢谢。我之所以提出这个问题是因为我在Google上搜索了“如何打印文件bash的年龄”。所以这正是我想要的!
诺亚·萨斯曼

5
谢谢!唯一需要注意的是,上述内容是时间戳记(而非年龄),但可用于计算年龄( let AGE=$(($(date +%s)-$(date -r /path/to/file +%s))) 假设已创建且从未修改,或“相对于mod的年龄”)
nhed

function file-age { FILE_CREATED_TIME=`date -r "$1" +%s`; TIME_NOW=`date +%s`; echo "$[ ${TIME_NOW} - ${FILE_CREATED_TIME} ]"; }
turiyag

1
@turiyag强制性说明$[ ],如果不建议弃用,则至少应较旧且不易携带,应$(( ))改为使用;反引号比易碎$( ); 并且函数名称中的连字符可能无法完全移植。不过,它的本质是好的!
michaelb958--GoFundMonica19年

23

使用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下面的时间来获取您可能想要的“更改时间”。

[更新]

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


日期和统计信息内置于什么外壳?我的bash(GNU,3.2.48)没有它们。
伊恩·克莱尔兰德09年

哎呀,对不起。stat不是内置的-对我非常不好,我会修复。
Guss

1
@Guss正确的解决方案是在brew中安装coretutils。:-)
Erik Johansson

1
@ErikJohansson我更喜欢在使用现有软件时不要求安装其他软件的情况很好-您知道这不是Windows ;-)
Guss 2015年

1
对于想要使用它但对其进行修改的人,最好确切地知道它在做什么:$(($(date +“%s”)-自1970-01-01 00:00:00 UTC以来的秒数(Epoch)$(stat -c“%Y” $ somefile)))-自从Epoch -gt“ 7200”以来的最后修改时间(以秒为单位)-检查差异是否大于x秒数。
2016年

16

创建时间不存储。

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

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

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


12

尽管从技术上讲 ctime并不是创建时间,但通常是。

由于ctime不受文件内容更改的影响,因此通常仅在创建文件时进行更新。是的-我听到大家都在尖叫-如果您更改访问权限或所有权,它也会被更新...但是通常这只是一次完成,通常是在将文件放到那里的同时进行。

就我个人而言,我总是使用mtime进行所有操作,我想这就是您想要的。但是无论如何……这是古斯的“吸引人” bash的重新演练,它具有易于使用的功能。

#!/ bin / bash
函数age(){
   本地文件名= $ 1
   本地更改=`stat -c%Y“ $ filename”`
   本地现在=“日期+%s”
   本地经过

   让过去=现在改变
   回显$ elapsed
}

file =“ /”
echo $ file的年龄为$(age“ $ file”)秒。

这很有用,但由于OS的实现方式不同,因此OSX无法立即使用。我发现唯一的跨系统兼容方法是使用perl。该脚本应在Mac上工作,如果你更换与此对应的行: local changed=$(perl -MFile::stat -e "print stat(\"${filename}\")->mtime") superuser.com/questions/427551/...
珠宝Trouvaille

1
“创造时间”是一个很难掌握的概念。对复制的文件意味着什么?移动文件该怎么办?如果它跨设备边界移动(从某种意义上说,它是重新创建的)怎么办?对于打包的和以后未打包的文件意味着什么?这里有几个答案,没有共识。虽然提到ctime很好,但是从语义上讲,我不会把它放在模糊的“创建时间”概念上。特别是由于chmod在文件上应用了simple ,将使该想法无效。但我可以和你一起做到这一点;-)
Alfe 2014年

@Alfe:您错过了+%s下半场的比赛
Grizly 2014年

该年龄可能更短:(age() { echo $(( $(date +%s) - $(date -r "$1" +%s) )); } 感谢@Grizly的改正!)
Alfe 2014年

实际上,最好使用访问时间,这是在所有安装了noatimeoption的文件系统上的创建时间(这对性能有好处,因此您应该使用它)。因此,只需使用%X代替即可%Y
Nux 2015年

7

找到一个很好,但我认为您可以使用另一种方法,尤其是如果您现在需要该文件旧多少秒

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

使用GNU日期


使用gstat,“ brew install coreutils”
Erik Johansson

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

您可以在此处看到访问/修改/更改的三个日期。没有创建日期。您只能真正确定何时修改了文件内容(“修改”字段)或其索引节点(“更改”字段)。

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

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

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


当然,统计信息可以告诉您相关信息。但是解析以获得我们想要的东西将是非常繁琐的。
PypeBros

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.