如何在BASH中使用stat -c '%n%Y'按最后修改时间排序文件?
嘿,我来帮你搞定这个问题!你现在的思路方向是对的,但问题出在stat的输出格式上——文件名和时间戳直接拼接在一起,sort没办法识别出后面的时间数字来排序。咱们分两种方法解决,一种是更可靠的推荐方案,另一种是适配你原来拼接格式的方法:
推荐方案:给stat输出加分隔符(最简单可靠)
首先修改stat的输出格式,让文件名和时间戳用空格分开,这样sort就能轻松按时间列排序了:
stat -c "%n %Y" <directory_path>* | sort -k2n
- 细节解释:
%n %Y:%n输出文件名,%Y输出Unix时间戳(从1970年至今的秒数),用空格分隔两者,每行输出类似myfile.txt 1690000000。sort -k2n:-k2指定按第二列排序,-n表示按数字大小排序(而不是字符串字典序)。- 如果想要从新到旧排序,加上
-r参数:sort -k2nr。
适配原拼接格式的方法(不推荐,但满足需求)
如果你一定要用%n%Y的拼接输出,那得先提取末尾的10位时间戳(Unix时间戳通常是10位),再排序:
stat -c "%n%Y" <directory_path>* | awk '{ts=substr($0, length($0)-9, 10); print ts, $0}' | sort -n | cut -d' ' -f2-
- 细节解释:
awk部分:提取每行最后10个字符作为时间戳,把时间戳放在行首,输出类似1690000000 myfile.txt1690000000。sort -n:按行首的时间戳数字排序。cut -d' ' -f2-:去掉行首的时间戳,还原成你原来的拼接格式。
为什么不推荐这个方法?因为如果你的文件名末尾本身包含数字,或者系统返回的时间戳不是10位(虽然极少发生),这个提取逻辑就会出错。所以优先用第一个方案更稳妥。
内容的提问来源于stack exchange,提问作者Juan Ortega
相关产品推荐
相关产品推荐

