Regex / bash查找最近日期的字符串?

时间:2016-11-05 15:59:48

标签: regex bash date

对于我的个人备份方案,我有一组名称在(something)_(day)(month)(year)_T(hour)(minute)(second)模式中的文件夹。这是一个样本:

01.hourly_02102016_T171011
00.daily_27092016_T102203
00.weekly_17032015_T050600

我想从此列表中选择名称中包含最近时间的文件夹。我如何在bash脚本中执行此操作?

2 个答案:

答案 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