2016-11-05 36 views
2

對於我的個人備份方案,我有一組文件夾,其名稱的格式爲(something)_(day)(month)(year)_T(hour)(minute)(second)。下面是一個示例:正則表達式/ bash查找帶有最新日期的字符串?

01.hourly_02102016_T171011 
00.daily_27092016_T102203 
00.weekly_17032015_T050600 

我想從此列表中選擇名稱中具有最近時間的文件夾。我將如何在bash腳本中做到這一點?

回答

4

也許,最短命令:

ls -1 | sort -t_ -k2.5nr,2 -k2.3nr,2 -k2.1nr,2 -k3r 

它按年,月,日,該訂單。 -t選項爲-k選項值中使用的列編號指定字段分隔符。

-kX.Ynr,2的選項放置在反向(r)數字順序(n)通過柱X,字符數目Y排序;在第2列停止排序(逗號後的最後一個字符)。

  -k2.5 
··············v 
00.weekly_17032015_T050600 
      ^^^^^^^^ 
      column 2 

最後-k3r按相反順序排列在第三列。

最近將位於列表的頂部。您可以通過在命令末尾附加| head -1來選擇它。

+0

不錯......在結尾處加上'-k3r'來按時間排序;-) – janos

+1

@janos,謝謝。添加到答案中。 –

2

假設目錄中的所有文件都在,你所描述的模式,那麼你可以通過重新排列(day)(month)(year)(year)(month)(day)名稱進行排序:

ls | sed -e 's/.*_\(..\)\(..\)\(....\)_\(T.*\)/& \3\2\1\4/' | \ 
    sort -rk2 | awk '{ print $1; exit }' 

說明:

  • sed捕獲(day)(month)(year)(_Ttime)並追加在行末重新排列爲(year)(month)(day)(_Ttime)
  • 我們排序與-k2第二場,我們在與sed每一行的末尾添加了重新排列值,並且使用相反的順序-r頂部
  • awk印刷品來獲取最新的值的第一個字段並退出

如果文件名可能包含空格,可以根據需要使用不同的字段分隔符。

順便說一句,如果您對備份文件使用不同的命名方案,所有這一切將變得更加容易。假如你在第一個地方使用(year)(month)(day),你可以得到最新的項目多以簡單:

ls | sort -rt_ -k2 | head -n 1 
+0

[不要解析'ls']的輸出(http://mywiki.wooledge.org/ParsingLs)。 – chepner

+0

如果我理解正確,按日期排序,但不按時間排序。對? –

+1

好點@EricDuminil,修正 – janos

相關問題