還有比這更好的方法來按文件的建立日期對文件進行排序嗎?

還有比這更好的方法來按文件的建立日期對文件進行排序嗎?

我需要顯示按創建日期排序的目錄列表,我想出了這個我認為很聰明的程式碼片段。有沒有一種更明顯的方法可以做到這一點,而我卻錯過了?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

樣本輸出

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

細節

上面的內容將從目錄中找到正好 3 個目錄$idir。然後它會列印在此深度找到的任何目錄的建立時間。然後,我從$idir輸出中剝離路徑的部分(不需要它),對其進行排序,然後砍掉%T@輸出的部分。這只是為了讓我可以更輕鬆地對輸出進行排序。

如果沒有尾隨,sed輸出看起來像這樣:

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

向我展示更乾淨的方法!

答案1

沒有好的、可移植的方法來按文件時間對文件進行排序。最便攜的方法是:

  • 如果您可以假設檔案名稱僅包含可列印字符,請呼叫ls -ltd.
  • 否則,請使用 perl。

這是使用 GNU 工具按日期對檔案進行排序的經典方法。您假設檔案名稱不包含換行符;透過更改\n\0並使用sort該選項進行呼叫可以輕鬆解決此問題-z。哦,還有,別再打迂迴sed電話了;請注意,如果$idir包含任何字符,您的腳本將無法工作,#*^$\[因為 sed 會將它們解釋為特殊字符。

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

順便說一句,您是按文件的修改時間而不是建立時間對文件進行排序。除 OSX 之外的大多數 UNIX 變體都不支援自始至終的創建時間(從檔案系統到核心再到用戶區工具)。

依修改時間對檔案進行排序的簡單、乾淨的方法是使用 zsh。 glob 限定符會om依年齡遞增對檔案進行排序(用於Om先取得最舊的檔案)。

files=(*(om))
echo "The oldest file is $files[-1]"

要獲得像您所顯示的那樣的輸出,您可以使用zstat

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

相關內容