Linux "find -regex" no maneja el enlace

Linux "find -regex" no maneja el enlace

Tengo los siguientes archivos y necesito combinarlos como:

./foo.bar1.sh       -match

./qux/foo.bar2.sh   -match

./foo.sh            -match

./baz.sh            -no match

./foo.bar3          -no match

Yo he tratado:

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

Pero no devuelve nada. No puedo entender por qué esa expresión regular no funciona.

Respuesta1

Tu expresión regular tiene dos errores:

  1. Le falta un punto (literal) después foo.

  2. findrequiere que escapes del paréntesis cuandonoutilizado como paréntesis literal.

Además, debes escapar el punto antes sh, ya que coincidirá con cualquier carácter.

El comando fijo ahora dice:

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

El error 2., por cierto, es la razón por la que no me gusta el cambio findde -regex: escape inconsistente.

Funciona, por supuesto, pero grep -Putiliza expresiones regulares compatibles con Perl (PCRE), por lo que hay más funciones, pero menos sorpresas y dificultades.

Personalmente, usaría:

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

información relacionada