对于我的个人备份方案,我有一组名称在(something)_(day)(month)(year)_T(hour)(minute)(second)
模式中的文件夹。这是一个样本:
01.hourly_02102016_T171011
00.daily_27092016_T102203
00.weekly_17032015_T050600
我想从此列表中选择名称中包含最近时间的文件夹。我如何在bash脚本中执行此操作?
答案 0 :(得分:4)
也许,最短的命令:
ls -1 | sort -t_ -k2.5nr,2 -k2.3nr,2 -k2.1nr,2 -k3r
按顺序按年,月和日排序。 -t
选项为-k
选项值中使用的列号指定字段分隔符。
-kX.Ynr,2
选项代表按列X
排序,字符编号Y
按反向(r
)数字顺序排序(n
);停止在第2列排序(逗号后面的最后一个字符)。
-k2.5
··············v
00.weekly_17032015_T050600
^^^^^^^^
column 2
最后一个-k3r
按顺序排列第三列。
最新的将位于列表的顶部。您可以通过将| head -1
附加到命令的末尾来选择它。
答案 1 :(得分: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