Eu tenho duas pastas CA01
e CA02
na pasta atual foo
:
foo -+
|
+-CA01
|
+-CA02
Quando eu digito
find . -regex ".*CA[0-9]+" -exec echo {} +
Ou
find . -regex ".*CA[0-9][0-9]" -exec echo {} +
Eu tenho a seguinte saída, que é esperada:
./CA01 ./CA02
Mas quando eu digito
find . -regex ".*CA[0-9]\{2\}" -exec echo {} +
Nada aparece, o que é bastante inesperado.
Porque, por padrão, find
usa regex emacs. Eu poderia usar todos os itens acima para combinar as duas pastas.
Estou faltando alguma coisa aqui?
Responder1
Você precisa alterar -regextype
para um que suporte contagens de repetições (ou seja, {2}
). O padrão emacs
não parece suportar as contagens. O tipo regex padrão imita uma versão mais antiga do Emacs que não tinha uma sintaxe para contagens de repetições. Os tipos abaixo parecem funcionar para mim.
Exemplos
posix-egrep
$ find foo -regextype posix-egrep -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
sed
$ find foo -regextype sed -regex ".*CA[0-9]\{2\}" -exec echo {} +
foo/CA02 foo/CA01
posix-estendido
$ find foo -regextype posix-extended -regex ".*CA[0-9]{2}" -exec echo {} +
foo/CA02 foo/CA01
Existem outros, mas não tentei mais. Veja a find
página de manual e procure por -regextype
.
excerto
-regextype type
Changes the regular expression syntax understood by -regex and
-iregex tests which occur later on the command line. Currently
implemented types are emacs (this is the default), posix-awk,
posix-basic, posix-egrep and posix-extended.
Minha versão de encontrar
$ find -version
find (GNU findutils) 4.5.9
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version 1778ee9e7d0e150a37db66a0e51c1a56755aab4f
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)