2017-03-19 19 views
0

我有這樣的命令(感謝名單給dgeorgiev):如何獲得有序輸出從發現

find /somePath -maxdepth 1 -name "log.out*" -type f \ 
    -printf "Date: %TY-%Tm-%Td - Time: %TT - File: %f\n" -exec tail -n5 {} \; 

我想有它的日期&時間排序的輸出,所以我得到的最新的文件最後。我想沒有辦法告訴find命令這樣做。所以我可能必須以某種方式結合查找,排序,尾巴。但是如何?

回答

0

我會建議在輸出中爲unix時間戳添加另一個字段。在gnu find的-printf格式字符串中,這表示爲%[email protected]

例如,排序的一切,你可以這樣做:

find/-type f -printf "%[email protected] Date: %TY-%Tm-%Td - Time: %TT - File: %f\n" \ 
    | LC_ALL=C sort -n -k1,1 \ 
    | cut -d' ' -f2- 

sort -n -k1,1在第一位(也是唯一的第一列)數值標準輸入排序線。 LC_ALL=C環境變量僅用於偏執狂。根據語言環境,sort的行爲有所不同。

最後cut最後是如果您不希望它在輸出中刪除unix時間戳。

還有一些替代方案,我將簡要描述這些及其缺點。

  • 使用ls

如果你想這裏僅列出當前目錄(因此一個的MAXDEPTH)的文件,那麼你可以使用ls -al和尋找開始-而不是線dl(用於過濾目錄和符號鏈接)。這是一種快速且骯髒的方式,以按排序順序獲取文件名並繼續前進。不要將它用於不可信的輸入或可能包含奇怪字符的文件名,它會以神祕的方式破解。

/bin/ls -latr | grep '^-' 

警告有關分析的ls輸出這裏(https://unix.stackexchange.com/questions/128985/why-not-parse-ls

  • 當你沒有GNU找到,但你有Perl。

下面是一個更強健的做事方式(只對文件名中的換行符進行扼殺),並避免了在每個文件的基礎上產卵過程。我們感興趣的事情是時間戳(在這種情況下,mtime(修改),這裏還有ctime(創建)和atime(訪問)。

您可以使用Perl從文件的訪問mtime unix時間戳,在文件名之前打印(用空格分隔),在第一列上按數字排序,然後刪除時間戳。

find/-type f | head -n 1000 \ 
    | perl -ne 'chomp; @a = stat($_); print($a[9], " ", $_, "\n");' \ 
    | LC_ALL=C sort -n -k1,1 \ 
    | cut -d' ' -f2-