Shell

按修改日期排序文件,然後按名稱

  • April 4, 2022

讓我們假設一個目錄包含來自不同相機的圖片:

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可能會失去文件的自然順序,這反映在名稱中。

如何按修改時間對文件進行排序,同時按名稱對具有相同修改時間的文件進行排序?

通常,建議避免解析ls輸出。正如上面建議的 doneal24,stat是一個更好的選擇。

$ stat -c "%Y/%n" *.JPG | sort -t/ -k1,1n -k2 | sed 's@^.*/@@'

來自man stat

文件的有效格式序列(不帶 –file-system):

%n 文件名

%Y 上次數據修改的時間,自 Epoch 以來的秒數

所以stat -c "%Y/%n" *.JPG會以秒為單位為您提供時間戳和每個文件的名稱,以/. 例如:

1580845717/IMG5841.JPG

該命令的輸出通過管道傳輸到sort -t/ -k1,1n -k2,它首先按第一列、數字(時間戳)排序,然後按第二列排序。列由/( -t/) 分隔。

最後,sort命令的輸出通過管道傳送到sed,這將刪除所有字元,包括第一個字元/(選擇的分隔符)。按您想要的順序顯示文件名列表中的結果(最後列出的“最新”文件)。

引用自:https://unix.stackexchange.com/questions/697826