我想用 ksh 或 bash 编写一个 shell 脚本,如果特定文件超过 30 分钟(上次修改时间超过半小时),则以 1 退出。在 Linux 或现代 unix 上很容易,但我必须在 AIX 5.2 版本上执行此操作。
因此限制条件为:
- ‘find’中没有 -mmin -mmax 选项
- touch 中没有 -d 选项(touch -d ‘30 分钟前’ temp然后找到!-较新的温度不起作用)
- 没有“stat”命令
- ‘date’ 命令中没有 %s 参数(日期 +%s不起作用)
- 我不被允许安装任何软件
您能帮我一下如何在这些限制条件下做到这一点吗?
答案1
我只需使用、和就可以做到这一点touch
。test
(date
在 AIX 5.3.0.0 上测试)
首先,您需要创建一个 30 分钟前的的文件(不幸的是,这需要事先了解机器上的当前时区。但如果需要的话,您可以将其融入其中。)
在此示例中,当前时区为 EST5EDT (GMT-4)。如果你很幸运,机器时区将设置为 GMT,你只需使用TZ=00:30
:
-bash-3.00# date
Mon 26 Mar 14:22:31 2012
-bash-3.00# touch -t `TZ=04:30 date '+%Y%m%d%H%M.%S'` foo
-bash-3.00# ls -al foo
-rw-r--r-- 1 root system 0 26 Mar 13:52 foo
现在使用测试来比较日期:
-bash-3.00# test '/smit.log' -ot foo && echo 'smit.log is older than 30min'
smit.log is older than 30min
答案2
使用ls
。
ls -l
列出文件的最后修改时间。您可以使用或
剖析输出,然后解析日期。awk
cut
请注意,在 AIX 上(与大多数 *nix 系统一样),提供的日期格式取决于ls
文件上次修改的时间。请参阅文档了解具体情况。
答案3
如果您有基础知识,bash/tsh 和 sed。您可以编写一个简单的脚本来测试与 ls 输出相关的文件时间:
#/bin/bash
LSOUTPUT=`ls -l`
IFS='
'
for f in $LSOUTPUT; do
echo $f
_sedout=`echo $f|sed 's/.*....-..-.. ..:\(..\).*/\1/'`
if [ "$_sedout" -gt 30 ]; then
echo "Passed!"
fi
echo
done
您必须改变 sed 正则表达式才能获取正确的位置,但只要您有 sed,这应该就可以工作。如果 ls 没有提供足够的详细信息,我相信您可以使用一个名为 istat 的命令。
如果您的 shell 是 ksh,那么语法应该与 bash 非常相似。我只是使用了那个示例,因为我使用的是 Ubuntu。
答案4
您仍然可以在 findutils 中安装 GNU find -http://www-03.ibm.com/systems/power/software/aix/linux/toolbox/alpha.html