如何判断文件是否超过/ bin/sh 30分钟?

mag*_*gol 38 unix linux sh

如何编写脚本以确定文件在/ bin/sh中是否超过30分钟?

不幸的是,系统中不存在统计数据.它是一个旧的Unix系统,http://en.wikipedia.org/wiki/Interactive_Unix

遗憾的是,Perl没有安装在系统上,客户也不想安装它,也没有其他任何东西.

Sch*_*ern 67

这是使用的一种方式find.

if test "`find file -mmin +30`"
Run Code Online (Sandbox Code Playgroud)

find如果相关文件包含空格或特殊字符,则必须引用该命令.

  • 不幸的是,我不认为它会可靠地运作.如果find确实返回了一个文件名并且没有形成测试内置的可接受参数,那么shell将声明它是一个错误.@Schwern提供的解决方案工作的唯一原因是因为`find`返回一个空字符串,测试结果为非零退出状态.在我看来,更好的解决方案是检查find是否返回了空字符串.如果找不到文件,则查找没有非零退出状态.否则,人们可能会使用`if find file -min + 30`. (6认同)

sle*_*man 28

以下为您提供以秒为单位的文件年龄:

echo $(( `date +%s` - `stat -L --format %Y $filename` ))
Run Code Online (Sandbox Code Playgroud)

这意味着对于超过30分钟的文件,这应该给出真/假值(1/0):

echo $(( (`date +%s` - `stat -L --format %Y $filename`) > (30*60) ))
Run Code Online (Sandbox Code Playgroud)

30*60 - 一分钟60秒,不预先计算,让CPU为你工作!

  • 可读性和可维护性.这比速度更重要,更重要. (13认同)
  • @Leo如果计算两个数字的产品是浪费你的应用程序的资源,你最好使用像C这样的可编译语言来解决你的问题,而不是像sh那样编写脚本. (8认同)
  • 您在这里浪费时间和资源讨论微型问题。无论您喜欢哪个,写30 * 60 *或* 1800。程序员也不会有真正的问题理解。真。而且只有在非常罕见的情况下,任何由于30 * 60造成的资源浪费都将具有可衡量的效果。将脚放在地面上。 (3认同)
  • 对于这样的单个命令,是的,但在大量环境中,这是一个带有代价高昂的缺点的坏习惯:浪费资源。如果您需要一个计算器来知道 7200 秒有多长,那么您就像使用 Tom-Tom 一样使自己变得愚蠢。 (2认同)
  • @Leo:在大量环境中,包含幻数的代码比浪费 CPU 时间的成本要高得多。只有在少数情况下,极端的微观优化是有保证的。但即使在这些情况下,大多数有经验的程序员也会告诉您优化的第一条规则。 (2认同)

alv*_*rre 16

如果你正在写一个sh脚本,最有用的方法是使用test已经提到的stat技巧:

if [ `stat --format=%Y $file` -le $(( `date +%s` - 1800 )) ]; then 
    do stuff with your 30-minutes-old $file
fi
Run Code Online (Sandbox Code Playgroud)

注意,这[是一个符号链接(或其他等价物)test; 看man test,但请记住,test并且[还内建bash的,因此可以有略微不同的行为.(另请注意[[bash复合命令).


Sch*_*ern 10

好的,没有统计数据和残缺的发现.这是您的替代方案:

编译GNU coreutils以获得合适的查找(以及许多其他方便的命令).你可能已经把它当作gfind了.

也许你可以date用来获取文件修改时间-r吗?

(`date +%s` - `date -r $file +%s`) > (30*60)
Run Code Online (Sandbox Code Playgroud)

或者,使用-nt比较来选择哪个文件更新,麻烦是在过去30分钟制作一个mod时间的文件. touch通常可以做到这一点,但所有投注都是关于什么是可用的.

touch -d '30 minutes ago' 30_minutes_ago
if [ your_file -ot 30_minutes_ago ]; then
    ...do stuff...
fi
Run Code Online (Sandbox Code Playgroud)

最后,看看Perl是否可用而不是挣扎谁知道shell实用程序的版本.

use File::stat;
print "Yes" if (time - stat("yourfile")->mtime) > 60*30;
Run Code Online (Sandbox Code Playgroud)


tom*_*sen 5

对于像我这样的人,根据@slebetman的回答,不喜欢背蜱:

echo $(( $(date +%s) - $(stat -L --format %Y $filename) > (30*60) ))
Run Code Online (Sandbox Code Playgroud)