Command-Line

按同名包含文件的最後修改日期/時間對目錄進行排序

  • August 10, 2015

是否可以使用grep,find等按同名文件(例如file.php)的最後修改日期對目錄列表進行排序?例如:

domain1/file.php (last modified 20-Jan-2014 00:00)
domain2/file.php (last modified 22-Jan-2014 00:00)
domain3/file.php (last modified 24-Jan-2014 00:00)
domain4/file.php (last modified 23-Jan-2014 00:00)

每個目錄具有相同的文件名(例如,file.php)。

結果應該是:

domain3/ (last modified 24-Jan-2014 00:00)
domain4/ (last modified 23-Jan-2014 00:00)
domain2/ (last modified 22-Jan-2014 00:00)
domain1/ (last modified 21-Jan-2014 00:00)

正如 Vivian 建議的那樣,該-t選項ls告訴它按修改時間對文件進行排序(預設情況下,最新的在前;如果添加則反轉-r)。這是最常用的(至少在我的經驗中)對目錄中的文件進行排序,但它也可以應用於命令行上的文件列表。萬用字元(“globs”)在命令行上生成文件列表。所以,如果你說

ls -t */file.php

它會列出

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php

但是,如果您添加-1(破折號)選項,或者將其通過管道傳輸到任何內容中,它將每行列出一個。所以你想要的命令是

ls -t */file.php | sed 's|/file.php||'

這是 中的普通 替換,但用作分隔符,因為包含 a ,並且帶有一個空的。(即,它會從輸出中刪除文件名及其之前的文件名 — — 。)當然,如果您想要目錄名稱的結尾,只需執行or .s/*old_string*/*replacement_string*/``sed``|old_string/replacement_string/``/file.php``ls``/``sed 's|file.php||'``sed 's/file.php//'

如果需要,添加-l(小寫 L)選項以ls 獲取長列表,包括修改日期/時間。然後您可能想要增強sed命令以去除不相關的資訊(例如文件的模式、所有者和大小),並且如果您願意,可以將日期/時間移到目錄名稱之後。

這將查看目前目錄的目錄,並且僅查看它們。(這似乎是問題所要求的。)對其他目錄進行單級掃描是一個微不足道的變化:

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'

(遞歸地)搜尋目前目錄(或其他頂級目錄)下的整個目錄樹有點棘手。輸入命令

shopt -s globstar

然後將*上述命令之一中的星號 ( ) 替換為兩個星號 ( **),例如,

ls -t **/file.php | sed 's|/file.php||'

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