
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}'
(GNU も想定grep
)、どのパスでも機能するはずです。正規表現では改行が許可されていないため、たとえば同様の名前を含むディレクトリと一致させる方法はありません。
答え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
。