Localiza nomes de arquivos com extensão em maiúsculas

2

Como posso encontrar todos os arquivos com sua extensão em maiúsculas em recursivamente em um diretório.

Eu tentei:

$ find -name "*.[A-Z][A-Z][A-Z]"

Parece funcionar, mas é claro que isso não verifica arquivos com mais de três letras após o último ponto.

    
por 40detectives 06.10.2018 / 17:15

2 respostas

5

Os seguintes trabalhos para casos simples:

find -name "*.*[A-Z]*" ! -name "*.*[^A-Z]*"

É possível falhar em arquivos com dois ou mais pontos no nome. Para este caso, você precisa usar expressões regulares, por exemplo, com grep :

find | grep '\.[A-Z][A-Z]*$'

ou egrep :

find | egrep '\.[A-Z]+$'

Após o comentário de Kamil Maciorowski, a resposta pode ser feita independente do código de idioma usando [:upper:] no lugar de A-Z , como em:

find | egrep '\.[[:upper:]]+$'

Receio que nós, falantes nativos de inglês, possamos facilmente esquecer tais assuntos.

    
por 06.10.2018 / 17:41
2

Você pode usar a opção RE com -regex

find -regextype posix-egrep -regex '.*\.[A-Z]{3}'

Há alguns pontos usando RE com find, aprendi isso em um livro pt_BR.

A opção

-regex deseja corresponder ao caminho completo, por isso, o .* corresponde a tudo antes do RE real que você quer combinar. Se o RE pode estar no meio, outro .* deve ser colocado no final.

O -regextype informa quais metacaracteres devem ser ignorados ou não.

O que eu sei é que no Unix / BSD find -E permite todos os meta-caracteres sem escape, e no GNU / Linux o mesmo é -regextype posix-extended , -regextype posix-awk ou -regextype posix-egrep .

    
por 06.10.2018 / 21:08