按日期排序


17

原版的:

2011年1月23日10:42有些事情2007.12.20.avi
2009年6月26日某事2009.06.25.avi
2010年2月12日有些东西2010.02.11.avi
2011年1月29日09:17有些事情2011.01.27.avi
2011年2月11日20:06某事2011.02.10.avi
2011年2月27日23:05某事2011.02.24.avi

输出:

2011年2月27日23:05某事2011.02.24.avi
2011年2月11日20:06某事2011.02.10.avi
2011年1月29日09:17有些事情2011.01.27.avi
2011年1月23日10:42有些事情2007.12.20.avi
2010年2月12日有些东西2010.02.11.avi
2009年6月26日某事2009.06.25.avi

我使用以下命令生成了上面的列表(原始):

ls -A -lR | grep "^-" | sed "s/.\{43\}/&\n/" | grep -v "^-" | while read ONELINE; do if echo $ONELINE | cut -d " " -f3 | grep -o '[0-9][0-9]:[0-9][0-9]' > /dev/null 2>&1; then echo $ONELINE | sed "s/.\{7\}/&$(date +%Y) /"; else echo $ONELINE; fi; done

如何获得最新文件位于顶部的输出?


2
@ user4724:yuo是如何生成列表的?

@ user4724:对于我来说,这不会产生相同类型的支出-不管Gilles有答案

Answers:



14

是您要排序的文本文件,还是您要按日期查看目录列表?对于后者,请使用-t标记ls。对于前者,请特别-M注意GNU排序的标志,该标志按三个字母的月份名称缩写排序。以下命令按第三,第一,第二和第四列进行排序,将第二个排序键视为月份名称。

sort -k 3 -k 1M -k2 -k4 in.txt

请考虑始终使用日语/ ISO风格的日期,始终按YYYY-MM-DD-HH-MM-SS的顺序(即最重要的第一位,恒定的列宽)。这种按日期排序的方法与字典顺序排序相同。


不要忘记该日期格式建议中的前导零。每当我自己格式化字符串时,都会使用这种格式。
stolenmoment,

@stolenmoment如果您不介意空格,则可以使用空格而不是零,重要的一点是带有常数的列。2018  5 26的效果和2018 05 26(只要您不经过合并连续空格的标记…)一样好,那么效果不好2018 5 26
吉尔斯(Gilles)'所以

是的,我反射性地避免了文件名中的空格,我敢肯定,您可以猜测原因。
stolenmoment,

3

我不确定在ls询问原始问题时命令中是否包含该功能,但是现在可以使用option --full-time

例如,

ls -t --full-time 

将以最旧的时间在底部排序;或者,如果您使用:

ls -tr --full-time

那么它将颠倒顺序。


问题是关于如何按修改日期/时间对文件排序。该-t选项可以完全回答该问题。--full-time没什么关系
G-Man说'恢复莫妮卡'

唯一的-t选项不能为您提供六个月内修改文件的年份,而--full-time可以为您提供准确的信息。您还可以使用时间样式来设置自己喜欢的日期格式。例如ls -ltr --time-style +%Y-%m-%d \%H:%M:%S
Bevan Thomas

我不确定你的意思是。  ls -t既没有提供文件的模式和所有者,主机名和操作系统版本,也没有提供中国茶的价格。  ls -t甚至根本不显示修改日期。但是问题不是关于显示文件信息,而是关于按修改日期对文件进行排序。您没有为问题的答案做出贡献;您正在添加熟悉的补充信息。当您获得50 点声望时,您可以发布这类信息作为评论
G-Man说'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.