對於我的個人備份方案,我有一組文件夾,其名稱的格式爲(something)_(day)(month)(year)_T(hour)(minute)(second)
。下面是一個示例:正則表達式/ bash查找帶有最新日期的字符串?
01.hourly_02102016_T171011
00.daily_27092016_T102203
00.weekly_17032015_T050600
我想從此列表中選擇名稱中具有最近時間的文件夾。我將如何在bash腳本中做到這一點?
對於我的個人備份方案,我有一組文件夾,其名稱的格式爲(something)_(day)(month)(year)_T(hour)(minute)(second)
。下面是一個示例:正則表達式/ bash查找帶有最新日期的字符串?
01.hourly_02102016_T171011
00.daily_27092016_T102203
00.weekly_17032015_T050600
我想從此列表中選擇名稱中具有最近時間的文件夾。我將如何在bash腳本中做到這一點?
也許,最短命令:
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
來選擇它。
假設目錄中的所有文件都在,你所描述的模式,那麼你可以通過重新排列(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
不錯......在結尾處加上'-k3r'來按時間排序;-) – janos
@janos,謝謝。添加到答案中。 –