
Com o find
comando GNU (GNU findutils 4.4.2), uma expressão regular pode ser usada para procurar arquivos. Por exemplo:
$ find pool -regextype posix-extended -regex ".*/mypackage-([a-zA-Z0-9.]+-[0-9]{1,2})-x86_64.pkg.tar.xz+"
É possível extrair ogrupo de capturadefinido por essa expressão e usá-lo em um -printf
argumento?
Portanto, dado um arquivo encontrado chamado pool/mypackage-1.4.9-1-x86_64.pkg.tar.xz
, gostaria de incluir a 1.4.9-1
parte em uma printf
expressão.
Isso é possível?
Responder1
Se você usar
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}'
(assumindo grep
também o GNU), deve funcionar para qualquer caminho. O regex não permite novas linhas, portanto não há como fazê-lo corresponder, por exemplo, a um diretório que contém um nome semelhante.
Responder2
Uma alternativa à boa resposta de l0b0 (mais curta, mas potencialmente um pouco menos eficiente):
Assumindo um (recente) GNU sed
:
find pool -print0 |
sed -znE 's|.*/mypackage-([[:alnum:].]+-[0-9]{1,2})-x86_64\.pkg\.tar\.xz$|\1|p'|
tr '\0' '\n'
Observe que a parte cara find
é descer da árvore, o que você terá que fazer de qualquer maneira, quer você tenha feito isso -regex
ou não. Então, aqui estamos fazendo a correspondência e o relatório sed
.