3

我有一组包含日期的文件。

让我们打电话给他们:

 a20120528_120001.log
 b20120528_120003.log
 (name)(year)(month)(day)_(hour)(minute)(second).log

通过执行以下操作同时移动这两个文件很容易:

 mv *20120528_12* file/

但是现在我有一种情况,我想在同一天移动几个小时的文件,即:

 a20120528_120001.log
 b20120528_120003.log
 a20120528_130001.log
 b20120528_130003.log
 a20120528_140001.log
 b20120528_140003.log

现在,如果我想转移所有这些,我可以做一天:

 mv *20120528* file/

但是如果我只想移动 12 和 13 小时,但不包括 14,我该怎么办。

请注意,这需要足够通用,以便我可以输入日期,因为这将扩展到多天使用,其中每天有 24 个日志,并且每天会排除几个(3-8 之间)日志。

我该怎么做?

4

2 回答 2

1

您可以使用范围:

mv *20120528_1[23]* file/

要排除 3-8 中的所有内容,请使用稍微复杂的:

mv *20120528_{0[0-29],[12]*}*
  • [0-29]分解为范围0-29
  • {A,B}展开为AB
于 2012-07-29T23:13:39.750 回答
1

这是一个很好的问题,因为在 Bash 中,文件名扩展只使用*,?[. 因此,您只能通过以下方式处理第 12 小时和第 13 小时:

[ab]20??????_1[23]????.log

请注意,这只会将您带到 2099 年;如果这让您感到困扰,请进行相应的调整。

但是,如果您需要一个一般范围的值,您将需要多个命令。如果您有 00 到 23 小时并且您想排除 03 到 08 小时,我认为您将需要以下内容:

[ab]20??????_0[0129]????.log
[ab]20??????_1?????.log
[ab]20??????_2[0123]????.log

当然,您也可以编写一个脚本来生成正确的模式,使用比文件名通配更复杂的方法。不过,不确定您是否需要那么复杂。

于 2012-07-29T23:14:19.393 回答