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-1printf

可能ですか?

答え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}'

grepGNUも同じだと仮定します)、すべてのパスで動作する必要があります。正規表現は改行を許可しないため、類似した名前を含むディレクトリと一致させることはできません。

答え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

関連情報