使用 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 {} \;
說明如下
-regextype
前面說過是指定 regular expression 的方言,可以指定這些 awk, egrep, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended ,這邊我們用 posix-egrep ,確保符合 posix 標準。-regex
的格式最前面使用了.*
,這是因為 find 輸出時的檔名會包含 LOG_DIR 路徑,所以必須用.*
來表示格式之前有可能有任何字元。- egrep 不能用 \d ,必須要用 [0-9] 才行,所以這邊用 [0-9]{4} 表示連續四個數字,[0-9]{2} 表示連續兩個數字。
find 搭配 regex 就可以更有彈性的去找出符合格式的檔名,不需要遷就 wildchar 了。
沒有留言:
張貼留言