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
。