让我们假设一个目录包含来自不同相机的图片:
DCIM1234.JPG
DCIM1235.JPG
DCIM1236.JPG
DSCN4120.JPG
DSCN4121.JPG
DSCN4122.JPG
DSCN4123.JPG
IMG5840.JPG
IMG5841.JPG
IMG5842.JPG
IMG5843.JPG
使用 可以轻松按修改日期对各个相机的所有这些文件进行排序ls -t
。问题是大多数文件系统的精度为 1 秒或更高,因此某些图片可能具有相同的时间戳,例如在连拍时。在这种情况下,ls -t
可能会失去文件的自然顺序,这反映在名称中。
如何按修改时间对文件进行排序,同时按名称对修改时间相同的文件进行排序?
答案1
通常,建议避免解析ls
输出。正如上面 didal24 所建议的,stat
是一个更好的选择。
$ stat -c "%Y/%n" *.JPG | sort -t/ -k1,1n -k2 | sed 's@^.*/@@'
从man stat
:
文件的有效格式序列(不带 --file-system):
...
%n 文件名
%Y 上次数据修改的时间,自纪元以来的秒数
因此,stat -c "%Y/%n" *.JPG
将为您提供以秒为单位的时间戳和每个文件的名称,以/
.例如:
1580845717/IMG5841.JPG
该命令的输出通过管道传输到sort -t/ -k1,1n -k2
,它首先按第一列排序,然后按数字(时间戳)排序,然后按第二列排序。列由/
( )分隔-t/
。
最后,命令的输出sort
通过管道传输到,这会删除第一个字符(选定的分隔符)sed
之前的所有字符(包括第一个字符)。/
结果按照您想要的顺序显示在文件名列表中(“最新”文件列在最后)。
答案2
查看该命令sort
并结合格式化ls
日期输出。像这样的事情应该是一个很好的起点:
TIME_STYLE=+%s ls -l | sort -k6,6n -k7 | awk '{print $7}'
ls -l
基于这样的输出:
-rw-rw-r--. 1 ajc ajc 669 1626129161 commit-types.txt
-rw-r--r-- 1 ajc ajc 3578 1638037524 emacsintro.org
-rw-r--r-- 1 ajc ajc 170 1646399639 README.md
该命令各部分的解释:
- TIME_STYLE 格式化 的日期列
ls -l
。在本例中,我们使用 Unix 纪元风格的输出+%s
sort -k6,6n -k7
。对输出的第 6 列进行数字排序ls -l
,然后使用默认的字母顺序方法按第 7 列进行排序。awk '{print $7}'
。只显示第 7 列。如果您想显示第 6 列,则需要使用awk '{print $6 $7}'
。