从每日日志归档中选择一系列日志

从每日日志归档中选择一系列日志

我有一个包含每日日志的文件夹,名为:

system-2013-01-01.log
system-2013-01-02.log
system-2013-01-03.log
system-2013-01-04.log
system-2013-01-05.log
system-2013-01-06.log
system-2013-01-07.log
system-2013-01-08.log
...
system-2013-01-31.log

如何选择(并复制)从 2013-01-01 到 2013-01-15 的日志?

答案1

bash支持大括号扩展,它允许您指定要在命令中扩展的多个值,甚至范围。例如,

$ echo {1..5}
1 2 3 4 5
$ echo foo_{01..05}
foo_01 foo_02 foo_03 foo_04 foo_05

因此您可以轻松指定要复制的文件范围

cp system-2013-01-{01..31}.log /some/destination/dir

bash将扩展到

cp system-2013-01-01.log system-2013-01-02.log system-2013-01-03.log ...

答案2

如果您有每天的文件,则可以在中使用序列表达式大括号:

cp -p system-2013-01-{01..15}.log /elsewhere

如果你没有每天的文件,你可以使用字符图案

cp -p system-2013-01-0[1-9].log system-2013-01-1[0-5].log /elsewhere

如果两个范围之一中没有匹配的文件,则该模式将保持不展开状态。设置空球选项(特定于 bash)以避免这种情况 ( shopt nullglob)。

Zsh 凭借其数字范围使这变得更容易<start-stop>全局模式

cp -p system-2013-01-<1-15>.log /elsewhere

另一种不需要 zsh 并且可以很好地扩展到更复杂情况的方法是用于find生成文件列表。您无需担心不匹配:cp将为每个匹配执行。

find . \( -name 'system-2013-01-0[1-9].log' -o -name 'system-2013-01-1[0-5].log' \) -exec cp -p {} /elsewhere \;

添加-type d -prune -oafterfind .以避免递归到子目录。

相关内容