星期日, 10月 16, 2022

find + egrep

使用 find 多半是用 wildchar 萬用字元來搜尋,使用方法簡單。但有些場景就需要用 regular expression 來找符合特定格式的檔名,這時候 find 可以勝任嗎?

find 指令提供了 -regex 參數,就可以使用此參數來指定格式;搭配的參數是 -regextype ,regular expression 雖說用法大致一樣,但語言難免都有方言存在,因此可以用這個參數來指定要用哪種 regular expression 的方言。

所以若是要在 LOG_DIR 目錄下找符合 app.log.2022-10-11 這樣類型的檔名然後做壓縮,就可以這樣寫:

find "${LOG_DIR}" \
    -type f \
    -regextype 'posix-egrep' \
    -regex '.*app\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}$' \
    -exec gzip {} \;

說明如下

  1. -regextype 前面說過是指定 regular expression 的方言,可以指定這些 awk, egrep, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended ,這邊我們用 posix-egrep ,確保符合 posix 標準。
  2. -regex 的格式最前面使用了 .* ,這是因為 find 輸出時的檔名會包含 LOG_DIR 路徑,所以必須用 .* 來表示格式之前有可能有任何字元。
  3. egrep 不能用 \d ,必須要用 [0-9] 才行,所以這邊用 [0-9]{4} 表示連續四個數字,[0-9]{2} 表示連續兩個數字。

find 搭配 regex 就可以更有彈性的去找出符合格式的檔名,不需要遷就 wildchar 了。

參考資料

沒有留言: