shell怎么筛选掉长度较短的数据 (shell排序的命令)

Linux常见需求就是文件分析

诱人的解决方案是使用ls命令按排序输出文件名,并使用awk等工具对结果进行操作。正如往常一样,由于文件名中可能包含任意字符(包括换行符),ls方法无法做到健壮,因此在脚本中永远不应使用。因此,我们需要其他方法来比较文件的元数据。

最常见的需求是获取目录中最近或最旧修改的文件,或者最大或最小的文件。Bash和所有ksh变体都可以使用条件表达式复合命令的-nt和-ot运算符来比较修改时间(mtime):

shell怎么排序和保留原文,shell排序算法

或者查找最旧的文件:

shell怎么排序和保留原文,shell排序算法

请注意,目录的mtime是该目录中最近添加、删除或重命名的文件的mtime。还要注意,-nt和-ot并未被POSIX测试规范指定,但许多Shell(如dash)仍然包含它们。没有类似的操作符可用于根据atime或ctime进行比较,因此需要使用外部工具;但是,在没有使用两端的非标准特性的情况下,几乎不可能生成可以安全解析的输出或在Shell中处理该输出。

find和sort的结合

如果排序条件与“按照mtime最旧或最新文件”不同,则可以使用GNU find和GNU sort结合使用,以生成用NUL字符分隔的文件名+时间戳的排序列表。默认情况下,它将递归操作。如有需要,GNU find的-maxdepth运算符可限制搜索深度为1个目录。以下是一些可能性,可根据需要进行修改以使用atime或ctime,或按相反顺序排序:

shell怎么排序和保留原文,shell排序算法

这些方法的一个缺点是整个列表都会被排序,而只需遍历列表以找到最小或最大的时间戳(假设我们只想要一个文件)会更快。然而,根据作业的规模,排序的算法劣势可能相对于使用Shell的开销来说可以忽略不计。

shell怎么排序和保留原文,shell排序算法

类似的用法模式在许多类型的文件系统元数据中都有效。此示例递归地获取每个子目录中最大的文件。这是在每个目录中对一组文件执行计算的常见模式。

如果读者提出此问题是为了轮转日志文件,则可能希望考虑使用logrotate(1),如果其操作系统提供了该工具。

更多

如果您对我分享的shell系列文章感兴趣,可以关注我,或者关注《shell脚本编程最佳实践》专栏,专栏内包含了作者数年一线大厂工作经验整理,可以帮您短时间快速了解shell,学会,学精shell。