
我們想要捕獲所有以“.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
,因此它們是隱式錨定的,這意味著匹配的名稱是完整的。