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