Command-Line

僅給定文件名,如何按時間對文件列表進行排序

  • February 28, 2014

給定文件名列表,如何按文件修改時間對其進行排序?

生成的輸出需要看起來與輸入完全相同,只是數據已相應排序。

這是輸入的範例。

/jobs/crm/import/done/20140227-1359-0009.txt
/jobs/bridge/open-workitem/done/20140227-1359-0009.txt
/jobs/bridge/opened-workitem/done/20140227-1359-0009.txt
/jobs/bridge/update-workitem/done/20140227-1401-0001.txt
/jobs/bridge/update-workitem/done/20140227-1403-0001.txt
/jobs/tfs/import/done/20140227-1401-0001.txt
/jobs/tfs/import/done/20140227-1403-0001.txt
/jobs/tfs/open-workitem/done/20140227-1359-0009.txt

假設您的輸入很小,並且文件名不包含空格或其他奇怪的字元,您可以使用ls.

ls -dt $(cat files)

$(cat files)將 的內容files放在命令行上,並將它們拆分為空格以獲取參數列表。 ls -t將文件列表作為參數,按 mtime 對它們進行排序,然後列印它們。 -d是必需的,因此它使用名稱而不是其內容列出目錄。

如果這還不夠,您可以嘗試使用decorate/sort/undecorate 模式,例如

$ while IFS=$'\n' read file; do
   printf '%d %s\n' "$(stat -c +%Y "$file")" "$file"
 done <files | sort -k1nr | cut -f 2- -d ' ' >files.sorted

where依次IFS=$'\n' read file; do ... done <files設置file每個換行符分隔的條目filesprintf...stat...變成,根據第一個欄位以相反的數字順序對行進行排序,然後<filename>刪除,只留下s 排序順序。<mtime> <filename>``sort -k1nr``cut``<mtime>``<filename>

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