确定shell脚本中文件的年龄

时间:2009-06-09 11:08:18

标签: unix shell file

天儿真好,

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

我想过做一个

touch -t YYYYMMDDHHmm.SS /var/tmp/toto

其中时间戳是58分钟前然后执行

find ./logs_dir \! -newer /var/tmp/toto -print

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

感激地收到任何建议。

欢呼声,

6 个答案:

答案 0 :(得分: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 \

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

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

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

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

答案 1 :(得分:11)

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

find . -mtime +0h55m

将返回修改日期早于55分钟前的所有文件。

答案 2 :(得分:4)

一块拼图可能正在使用stat。您可以传递-r-s以获取所有文件元数据的可解析表示。

find . -print -exec stat -r '{}' \;

AFAICR,第10列将显示mtime。

答案 3 :(得分:2)

现在这是一个古老的问题,对不起,但为了其他人寻求一个好的解决方案,我就是......

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

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

另一个选项是使用stat(1)命令以秒为单位返回文件的年龄,使用date命令以秒为单位返回时间。结合bash shell数学运算符,可以很容易地计算文件的年龄:

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

你可以在没有这两个变量的情况下完成上述操作,但是它们会使事情变得更加清晰,使用bash数学(也可以替换)。多年来我在脚本中广泛使用了find(1)方法并推荐它,除非你真的需要知道几秒钟的年龄。

答案 4 :(得分:1)

由于您要测试特定文件的时间,您可以先使用test并将其与您专门创建的文件进行比较来开始:

test /path/to/file -nt /var/tmp/toto

或:

touch -t YYYYMMDDHHmm.SS /var/tmp/toto
if [/path/to/file -nt /var/tmp/toto]
   ...

答案 5 :(得分:0)

您可以使用ls和awk来获取所需内容。 Awk有一个c-ish printf,允许您以任何方式格式化列。

我在linux上使用bash和在solaris上使用ksh进行了测试。

提供选项以获得应用程序的最佳值。特别是bash中的“--full-time”和ksh中的“-E”。

的bash

ls -l foo | awk '{printf "%3s %1s\n", $6, $7}'

2011-04-19 11:37

ls --full-time foo | awk '{printf "%3s %1s\n", $6, $7}'

2011-04-19 11:37:51.211982332

ksh的

ls -l bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

5月3日11:19

ls -E bar | awk '{printf "%3s %1s %s\n", $6, $7, $8}'

2011-05-03 11:19:23.723044000 -0400