捕获以任意数字结尾的日志文件

捕获以任意数字结尾的日志文件

我们想要捕获所有以“.log.[任意数字]结尾的日志

所以我创建了这个语法

find .  -type f  -regex '^.log.*[0-9]$' -print

command does not give any output 

但这不会捕获如下文件(预期结果)

  controller.log.2018-01-03-01  
  server.log.2017-10-31-03
  server.log.2018-01-23-11
  server.log.2018-04-06-17  
  server.log.2018-07-07-05
  controller.log.2018-01-03-02  
  log-cleaner.log.10           
  server.log.2017-10-31-04 
  server.log.2018-01-23-12  
  server.log.2018-04-06-18 
  server.log.2018-07-07-06
  controller.log.2018-01-03-03 
  log-cleaner.log.2   
  server.log.232.434

我的语法有什么问题吗?

答案1

-regex(GNU 扩展find现在也被其他一些实现所认可,但有重大差异)类似于-path,只是它使用正则表达式而不是通配符。它匹配整个文件路径,而不仅仅是其名称。

因此.*\.log.*[0-9](不需要^$顺便说一句,它们是隐式的find-regex将匹配./dir/foo.log-3但也./foo.logic/file.bz2匹配捕获.*ic/file.bz.

-name与文件匹配姓名仅使用通配符,但没有对应的正则表达式。在这里,对于名称包含数字.log并以数字结尾的文件,您无论如何都不需要正则表达式,-name '*.foo*[0-9]'.

您可以使用 regexp 执行相同的操作-regex '.*\.log[^/]*[0-9]',即确保.log最后一个数字之间的部分不包含任何内容/,因此它仅与文件名匹配。

使用-regex,您可以进一步指定模式,特别是如果您启用扩展正则表达式,-E与某些 BSDfind-regextype posix-extendedGNU 一起使用find

find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD

这里匹配 on.log后跟一个或多个.<number>or -<number>

没有-regextype posix-extendedGNUfind的正则表达式是emacs正则表达式,标准基本正则表达式和标准扩展正则表达式之间的某种混合(支持+,但分组是用\(...\)而不是(...))。

没有-EBSDfind正则表达式是标准的基本正则表达式。

答案2

尝试,

find .  -type f   -regex  ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
  • 我们需要逃离.

答案3

如果“log”之后只有数字、.-,则以下内容也可能有效

find .  -type f   -regex  ".*[.]log[-.0-9]*$" 

答案4

您可以使用以下方式搜索文件,而无需求助于non-GNU find

find . -type f \
    \( -name '?*.log.[0-9]' -o \
       \( \
           -name '?*.log.[0-9]*[0-9]'  \
         ! -name '?*.log.?*[!0-9.-]*?' \
         ! -name '?*.log.?*[.-][.-]*?' \
       \) \
    \) \
    -print;

其作用是对其捕获的文件名进行多层过滤,并逐渐缩小捕获范围并集中于所需的文件名。准确地说:

  • 立即选择任何文件basename,其路径以 ,即,w/o 结尾.log.single_digit
  • OTW,选择以“这”结尾的文件名.log. NUM anything NUM,这将设置文件名被网络捕获的趋势。
  • 在上述捕获中,拒绝那些碰巧在文件名部分non number, non dash, or non dot中有 a 的文件。anything请注意,必须遵循以数字开头和结尾的趋势。
  • 现在我们的捕获包含所有这些文件,其中anything部分仅包含digit(s)dot(s)dash(s)。最后一个约束是dotdash不能将每个都作为其左侧和右侧的直接邻居。
  • PS 请注意,该-name选项仅查看文件名的基本名称部分,并且
  • -name部分在此基础上运行wildcard,因此它们是隐式锚定的,这意味着匹配的名称是完整的。

相关内容