Estou ficando bastante confuso com find
o uso de expressões regulares do comando Linux.
Estou ciente de que existe uma opção regextype
, mas sem isso, de acordo com a página de manual atual, ela deve usar expressões regulares do Emacs. Esta página parece dizer que as classes de caracteres são suportadas ("este é um recurso POSIX"), mas meus experimentos parecem mostrar que nada funciona [[:ascii:]]
ou funciona [[:digit:]]
, [[:alnum:]]
além do fato de que essas são formas verdadeiramente arcaicas de lidar com classes de caracteres. Em vez disso, você parece ter que usar o [a-zA-Z]
que, além de qualquer outra coisa, é inútil para caracteres Unicode.
Então eu me virei para regextype
: Acho que você obtém uma lista de configurações possíveis acessando find -regextype help
. Isto dá:
find: Unknown regular expression type ‘help’; valid types are ‘findutils-default’, ‘awk’, ‘egrep’, ‘ed’, ‘emacs’, ‘gnu-awk’, ‘grep’, ‘posix-awk’, ‘posix-basic’, ‘posix-egrep’, ‘posix-extended’, ‘posix-minimal-basic’, ‘sed’.
... então eu assumi que incluindo -regextype posix-basic
, por exemplo, eu seria capaz de executar algo assim:
find . -maxdepth 1 -regextype posix-basic -regex .*\d.*
Isso produz resultados, mas não os que eu esperava: todos os arquivos e pastas no diretório atual com a letra minúscula "d" em seus nomes! Eu estava esperando todos os nomes com pelo menos um dígito.
Eu olhei para muitas find
perguntas de regex do Linux aqui no Stack Exchange, mas acho que não vi uma única em que o manuseio de classes de caracteres "moderno" é demonstrado. Alguma das regextype
opções é capaz de lidar com algo assim:
find . -maxdepth 1 -regextype ??? -regex '.*\d{3}\s+.*'
onde quero dizer "contém três dígitos seguidos por um ou mais caracteres de espaço vazio". Ou seja, algo como regras regex de uma linguagem normal como Java, Python, Javascript, etc...?
mais tarde, seguindo os comentários
Aqui está um exercício: crie um diretório e coloque alguns arquivos nele com nomes aleatórios. Em seguida, adicionei arquivos com os seguintes nomes: 'ctb117b', 'ctb117c', 'trt117a'.
Eu então quero isolar os arquivos '117'. Pode haver arquivos chamados 'xxx0009333qqq'. Então, usando um mecanismo regex moderno, eu faria assim, por exemplo (permitindo o ./ anterior):
find . -regex './\w{3}\d\{3}.*'
Usando essas regras de regex Linux mais veneráveis, o que eu coloco que funciona?
find . -regextype posix-basic -regex '.*[[:digit:]]{3}.*'
não produz nada. Nem '.*[[:digit:]]+.*'
, por exemplo. Se alguém estiver suficientemente interessado, por favor me mostre algo que funcione para você (lista os arquivos acima).
Eu recomendaria usar isso: