常规的做法ls的问题
ls -t | head -1的直觉答案是错误的,因为解析ls的输出是不安全的;相反,你应该创建一个循环并比较时间戳:
然后你将在$newest中得到最新的文件(按修改时间排序)。要获取最旧的文件,只需将-nt更改为-ot(请参阅help test了解操作符列表),当然还要更改变量的名称以避免混淆。
Bash没有其他比mtime更多的文件时间戳比较方法,所以如果你想获取(例如)最近访问的文件(按atime排序),你需要从外部命令stat(1)(如果你有的话)或可加载的内置命令finfo(如果你可以加载内置命令)获得一些帮助。
利用coreutils做法
以下是使用GNU coreutils 6.10的stat来获取最近访问的文件的示例(可惜的是,即使在Linux系统中,stat的语法也不一致)。在这个版本中,%X是最后访问时间。
这种方法的缺点是为目录中的每个文件派生一个外部命令,所以只有在必要时才应该这样做。使用这种技术获取最旧的文件,你需要用最大可能的时间戳(特别是当我们接近2038年时,这是一个棘手的问题)或者用目录中第一个文件的时间戳来初始化oldest_t,就像在第一个示例中所做的那样。
符合posix标准的做法
这里是另一种产生外部命令的解决方案,但是符合posix标准:
示例:如何仅保留最新的目录。(注意,目录的修改时间是最后一次更改该目录的操作的时间——即最后一次文件创建、文件删除或文件重命名时间。)
更多
今天我们分享了通过shell进行文件时间的一个分析,解析了各种脚本的写法和介绍,如果对您有帮助,可以点击分享或者收藏,如果您对shell编程感兴趣可以关注《shell脚本编程最佳实践》,该实践专栏包含了作者数年生产环境最佳案例分享,shell深层次应用解读,助您快速了解shell脚本编程方方面面,工作中提效助力。