HP-UX下ksh环境统计1小时前文件数量的替代方案
解决HP-UX ksh下统计1小时前创建文件的问题
刚好碰到过HP-UX老版本find的这个坑!因为HP-UX自带的find是Berkeley风格的,不支持-mmin参数,而且-mtime只接受整数天数(不像GNU find支持小数),所以你之前的两个命令都报错了。给你几个靠谱的替代方案:
方案1:用Perl跨平台实现(最推荐)
Perl在几乎所有UNIX/Linux系统都预装,而且处理时间戳非常灵活,完全不依赖find的版本:
find . -type f -exec perl -e 'print((stat($ARGV[0]))[9] < time() - 3600 ? "1\n" : "")' {} \; | wc -l
原理说明:
stat($ARGV[0])获取文件的元数据,第9个元素是文件的修改时间戳(从epoch开始的秒数)time() - 3600计算出1小时前的时间戳- 对比两者,如果文件修改时间早于1小时前,就输出一行"1",最后用
wc -l统计行数,就是符合条件的文件数量
方案2:使用GNU Find(如果已安装)
很多HP-UX系统会安装GNU工具集(比如通过HP Software Assistant或者第三方源),GNU find支持-mmin参数,此时可以直接用:
gfind . -type f -mmin +60 | wc -l
注意:GNU find在HP-UX下通常叫
gfind,而不是默认的find,如果找不到可以试试which gfind确认是否安装。
方案3:用ls+awk处理(依赖ls输出格式)
如果系统没有Perl和GNU find,也可以通过解析ls的时间输出来实现,但这个方法依赖HP-UX的ls格式,需要先确认你的ls -lT输出的时间格式(比如是否是MM/DD/YYYY HH:MM:SS):
ls -lT . | grep '^-' | awk '{ split($7, date, "/"); split($8, time, ":"); file_time = mktime(date[3] " " date[1] " " date[2] " " time[1] " " time[2] " " time[3]); if (file_time < systime() - 3600) count++ } END {print count}'
注意:
ls -lT会显示完整的时间戳(包括时分秒)grep '^-'过滤出普通文件(排除目录、链接等)- awk的
mktime函数把字符串转换成时间戳,再和1小时前的时间对比统计
内容的提问来源于stack exchange,提问作者sugunan
相关产品推荐
相关产品推荐

