
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:
Le falta un punto (literal) después
foo
.find
requiere 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 find
de -regex
: escape inconsistente.
Funciona, por supuesto, pero grep -P
utiliza 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"