Linux “find -regex” não lida com ligação

Linux “find -regex” não lida com ligação

Eu tenho os seguintes arquivos e preciso combiná-los como:

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

Eu tentei:

find . -regex ".*foo(bar[0-9])?\.sh"

Mas não retorna nada. Não consigo entender por que esse regex não funciona.

Responder1

Sua expressão regular tem dois erros:

  1. Falta um ponto (literal) depois de foo.

  2. findexige que você escape dos parênteses quandonãousado como parênteses literais.

Além disso, você deve escapar do ponto antes sh, pois ele corresponderá a qualquer caractere.

O comando fixo agora diz:

find . -regex ".*foo\(\.bar[0-9]\)?\.sh"

A propósito, o erro 2. é a razão pela qual não gosto da opção findde -regex: Escape inconsistente.

Funciona, é claro, mas grep -Pusa expressões regulares compatíveis com Perl (PCRE), portanto, há mais recursos, mas menos surpresas e armadilhas.

Pessoalmente, eu usaria:

find . | grep -P "foo(\.bar\d)?\.sh"

informação relacionada