Bash

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

  • October 10, 2013

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

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

告訴我一個更清潔的方法!

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

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

這是使用 GNU 工具按日期對文件進行排序的經典方法。您假設文件名不包含換行符;這很容易通過更改\n為並使用該選項\0呼叫來解決。哦,放棄迴旋處的電話;請注意,如果包含任何腳本,您的腳本將不起作用,因為 sed 會將它們解釋為特殊字元。sort``-z``sed``$idir``#*^$\[

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)

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