我们想要捕获所有以“.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-extended
GNU 一起使用find
。
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
这里匹配 on.log
后跟一个或多个.<number>
or -<number>
。
没有-regextype posix-extended
GNUfind
的正则表达式是emacs正则表达式,标准基本正则表达式和标准扩展正则表达式之间的某种混合(支持+
,但分组是用\(...\)
而不是(...)
)。
没有-E
BSDfind
正则表达式是标准的基本正则表达式。
答案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)
。最后一个约束是dot
或dash
不能将每个都作为其左侧和右侧的直接邻居。 - PS 请注意,该
-name
选项仅查看文件名的基本名称部分,并且 -name
部分在此基础上运行wildcard
,因此它们是隐式锚定的,这意味着匹配的名称是完整的。