按修改日期排序文件,然后按名称排序

按修改日期排序文件,然后按名称排序

让我们假设一个目录包含来自不同相机的图片:

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

该命令各部分的解释:

  1. TIME_STYLE 格式化 的日期列ls -l。在本例中,我们使用 Unix 纪元风格的输出+%s
  2. sort -k6,6n -k7。对输出的第 6 列进行数字排序ls -l,然后使用默认的字母顺序方法按第 7 列进行排序。
  3. awk '{print $7}'。只显示第 7 列。如果您想显示第 6 列,则需要使用awk '{print $6 $7}'

这是排序文档文件时间戳文档

相关内容