Linux下按毫秒级时间戳正确排序文件的方法求助
解决毫秒级间隔文件的ls排序异常问题
这种文件创建间隔小于1秒、导致秒级时间戳相同,ls排序不符合实际创建顺序的问题真的挺闹心的,我帮你梳理下可行的解决思路和步骤:
1. 先确认文件的真实亚秒级时间戳
首先得搞清楚服务器到底有没有记录这些文件的亚秒级时间信息,用stat命令就能精准查看:
# 显示文件名和带纳秒的修改时间 stat -c "%n %y" *.txt
如果输出里能看到类似 1.txt 2024-05-20 14:30:00.123456789 +0800 的结果,说明时间戳确实包含亚秒差异;如果所有文件的时间都是 2024-05-20 14:30:00.000000000,那就是文件系统不支持亚秒级时间戳,得换别的方法。
2. 手动按精确时间戳排序
要是stat显示时间戳有亚秒差异,但ls --full-time -ltr排序还是不对,大概率是某些版本的ls没正确处理亚秒级排序逻辑。这时候咱们用stat结合sort手动来排:
# 按修改时间(含亚秒)排序后只输出文件名 stat -c "%y %n" *.txt | sort | awk '{print $4}'
这个命令先把时间和文件名一起输出,按时间(包括亚秒)排好序后,再提取出文件名,就能得到你要的正确创建顺序了。
3. 文件系统不支持亚秒时间戳的替代方案
如果stat显示所有文件的时间戳秒级完全一致,说明你的文件系统(比如老版本的ext3)没记录亚秒信息,这时候可以试试这两种方法:
- 按inode号排序:大多数情况下,新创建的文件会分配更大的inode号(只要没有删除其他文件干扰),用这个命令:
# 按inode号升序排序,输出文件名 ls -i *.txt | sort -n | awk '{print $2}' - 查看文件创建时间(birth time):像ext4这类新一点的文件系统会记录文件的创建时间,试试这个:
注意:有些Linux发行版或文件系统不支持stat -c "%w %n" *.txt | sort | awk '{print $4}'%w这个参数,要是输出为空就换别的方法。
4. 排查ls排序异常的其他可能
要是以上方法都没问题,但ls排序还是不对,可能是ls版本的问题,试试升级到最新的GNU ls;或者检查下环境变量LC_COLLATE,它可能会影响文件名的排序规则。
内容的提问来源于stack exchange,提问作者chetan
相关产品推荐
相关产品推荐

