Bash
有比這更好的方法來按創建日期對文件進行排序嗎?
我需要顯示一個按創建日期排序的目錄列表,我想出了這個我認為有點聰明的程式碼片段。有沒有更明顯的方法可以做到這一點,我錯過了?
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)