确定shell脚本中文件的年龄

Rob*_*lls 10 unix shell file

天儿真好,

我需要从sh shell脚本中查看特定文件是否超过58分钟.我说的是直接的vanilla Solaris shell,看起来有一些POSIX扩展.

我想过做一个

touch -t YYYYMMDDHHmm.SS /var/tmp/toto
Run Code Online (Sandbox Code Playgroud)

时间戳是58分钟前然后做一个

find ./logs_dir \! -newer /var/tmp/toto -print
Run Code Online (Sandbox Code Playgroud)

我们需要使用镜像对从各种服务器检索到的一些日志文件进行后处理.等待文件稳定是该团队决定镜像是否完成的方式,因此当天的日志现已完成并准备好进行处理.

任何建议都感激不尽.

干杯,

Mar*_*cos 17

我需要一些东西来测试特定文件的年龄,而不是经常重新下载.所以使用GNU datebash:

# if file's modtime hour is less than current hour:
[[ $(date +%k -r GPW/mstall.zip) -lt $(date +%k) ]] && \
wget -S -N \
http://bossa.pl/pub/metastock/mstock/mstall.zip \
Run Code Online (Sandbox Code Playgroud)

更新 - 这个版本对我来说效果更好,更准确,更容易理解:

[[ $(date +%s -r mstall.zip) -lt $(date +%s --date="77 min ago") ]] && echo File is older than 1hr 17min
Run Code Online (Sandbox Code Playgroud)

BSD变体(在Mac上测试)是:

[[ $(stat -f "%m" mstall.zip) -lt $(date -j -v-77M +%s) ]] && echo File is older than 1hr 17min
Run Code Online (Sandbox Code Playgroud)

  • 第二个版本是 date(1) 命令的一个非常优雅(和清晰)的使用,漂亮的代码! (2认同)

alx*_*lxp 11

您可以在find命令中使用不同的单位,例如:

find . -mtime +0h55m
Run Code Online (Sandbox Code Playgroud)

将返回任何修改日期早于55分钟的文件.

  • find有一个-mmin谓词,例如.-mmin +58 (5认同)
  • 这取决于find的版本.也许你可以在一个真正的新版本,或者Mac或其他东西中做到这一点,但我的大多数Linux机器上的GNU Find 4.2都需要"-mtime"增加24小时. (4认同)

Bri*_*n C 5

现在这是一个老问题了,抱歉,但是为了其他人像我一样寻找一个好的解决方案......

我能想到的最好的方法是使用find(1)命令,这是我所知道的唯一可以直接测试文件年龄的 Un*x 命令:

if [ "$(find $file -mmin +58)" != "" ]
then
  ... regenerate the file ...
fi
Run Code Online (Sandbox Code Playgroud)

另一个选项是使用stat(1)命令以秒为单位返回文件的存在时间,并使用 date 命令以秒为单位返回当前时间。与 bash shell 数学运算符相结合,计算出文件的年龄变得非常容易:

age=$(stat -c %Y $file)
now=$(date +"%s")
if (( (now - age) > (58 * 60) ))
then
    ... regenerate the file ...
fi
Run Code Online (Sandbox Code Playgroud)

您可以在没有两个变量的情况下执行上述操作,但它们使事情变得更清晰,就像使用 bash 数学(也可以替换)一样。多年来,我在脚本中广泛使用了 find(1) 方法,并推荐它,除非您确实需要以秒为单位了解年龄。