捕獲以任意數字結尾的日誌文件

捕獲以任意數字結尾的日誌文件

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

相關內容