linux中ls -t默认按mtime(修改时间)排序,因mtime最可靠且广泛支持;-r用于反向,故ls -ltr为升序(最旧在前),适用于查找最早文件或清理过期备份。

Linux 默认不按时间顺序显示文件,必须显式指定排序方式;最常用、最直接的方法是 ls -lt(修改时间倒序)或 ls -ltr(修改时间正序)。
为什么 ls -t 是默认按修改时间(mtime)排序
Linux 文件系统本身不记录“创建时间”,ls -t 实际依据的是 mtime(最后修改时间),这是最可靠、最广泛支持的时间戳。访问时间(atime)可能被禁用(如挂载时加 noatime),状态变更时间(ctime)又容易被 chmod/chown 等操作意外触发,所以 mtime 是日常排查“哪个文件刚改过”的事实标准。
常见误操作:
- 以为
ls -tc是“按创建时间”——其实c指的是 inode 状态变更时间,不是 Windows 风格的 creation time - 执行
ls -t却没看到预期文件——可能该文件是刚touch过但未写入内容,mtime未更新(touch -m才强制改 mtime)
ls -ltr 和 ls -lt 的区别与适用场景
-t 表示按 mtime 降序(最新在前),-r 是 reverse,两者合起来就是升序(最旧在前)。实际使用中:
- 查“最近改了什么”:用
ls -lt—— 日志轮转后看最新日志、代码提交后看哪些文件变了 - 查“最早那个文件还在不在”:用
ls -ltr—— 清理备份时找最老的 tar 包、确认某个临时文件是否已过期 - 加
-h更友好:ls -lth(人类可读大小)或ls -lhtr(升序 + 可读大小)
需要按访问时间(atime)或状态时间(ctime)怎么办
虽然不推荐作为主排序依据,但某些审计或调试场景确实需要:
- 按最后访问时间:
ls -lu(注意是小写u,不是U) - 按 inode 状态变更时间:
ls -lc - 这些选项仅在
ls中有效,且输出列标题不会变(仍是“Modify”字样),得靠文档或stat交叉验证 - 如果
atime不准(比如系统启用了relatime或noatime),ls -lu结果就不可信
当 ls 不够用:用 find + sort 精确控制时间粒度
ls 只能按天级精度分组(-mtime -1),而真实需求常要“过去 2 小时内的日志”或“精确到秒”。这时必须组合 find 和 sort:
find /var/log -name "*.log" -type f -printf '%T@ %p\n' | sort -n | cut -d' ' -f2-
说明:
-
%T@输出修改时间的 Unix 时间戳(秒级精度,含小数) -
sort -n按数字排序(不是字典序),保证时间先后正确 -
cut -d' ' -f2-去掉前面的时间戳,只留路径 - 换成
%A@或%C@可分别对应atime和ctime
这个链路绕过了 ls 的格式限制,也避开了不同 locale 下时间字符串解析失败的问题,是脚本中真正可靠的方案。
真正容易被忽略的点:终端宽度会影响 ls 的列对齐,导致 ls -l | sort +7 这类老式写法在宽屏或窄屏下都可能错位——现代 Linux 已不推荐这种基于空格切列的方式,find -printf 是更稳的选择。











