正規表示式捕獲組可以在 GNU find 指令中使用嗎?

正規表示式捕獲組可以在 GNU find 指令中使用嗎?

使用 GNUfind指令(GNU findutils 4.4.2),可以使用正規表示式來搜尋文件。例如:

$ find pool -regextype posix-extended -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64.pkg.tar.xz+"

是否可以提取捕獲組由該表達式定義並在參數中使用它-printf

因此,給定一個名為 的找到文件pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz,我想將該1.4.9-1部分包含在printf表達式中。

這可能嗎?

答案1

如果你使用

find pool -regextype posix-extended \
    -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz" \
    -printf '%f\n' |
  grep -Eo '[a-zA-Z0-9.]+-[0-9]{1,2}'

(假設grep也是 GNU),它應該適用於任何路徑。正規表示式不允許任何換行符,因此無法使其符合例如包含相似名稱的目錄。

答案2

l0b0 的最佳答案的替代方案(更短,但效率可能稍低):

假設(最近的)GNU sed

find pool -print0 |
  sed -znE 's|.*/mypackage-([[:alnum:].]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz$|\1|p'|
  tr '\0' '\n'

請注意,最昂貴的部分find是走下樹,無論您是否有,它都必須這樣做-regex。因此,我們在這裡進行匹配和報告sed

相關內容