Regex não corresponde ao arquivo usando 'find' apesar de ser válido [duplicado]

4

Eu estou tentando executar este comando find para corresponder arquivos com um nome de camelo, com o objetivo de colocar um espaço entre letras maiúsculas e minúsculas adjacentes, mas não está combinando nada:

find -E . -regex "([a-z])([A-Z])"

Um exemplo de um arquivo que estou tentando corresponder é

./250 - ErosPhiliaAgape.mp3

Eu testei esse regex neste arquivo aqui e ele corresponde com êxito.

O que estou fazendo de errado com o comando find ?

    
por Chris Wilson 23.12.2016 / 16:23

3 respostas

4

Você provavelmente está procurando por algo como:

find . -name "*[a-z][A-Z]*"
    
por 23.12.2016 / 16:28
3

O -regex de Find corresponde ao caminho inteiro, não apenas ao nome do arquivo. Isso significa que, para encontrar /path/to/foo , você precisa de -regex '. * Foo' , and not just foo '. Você quer algo como:

find  . -E -regex ".*[a-z][A-Z].*"

Seria muito mais simples usar globs e o mais simples -name como sugerido pela SYN, no entanto, em vez de regexes.

    
por 23.12.2016 / 17:13
1

Isso acontece porque ([a-z])([A-Z]) não corresponde a ./250 - ErosPhiliaAgape.mp3 . Na verdade, ([a-z])([A-Z]) pode corresponder exatamente a dois caracteres - -regex é uma correspondência ancorada ao longo de todo o caminho. Se você quiser usar -regex para procurar um arquivo cujo nome contenha um regex, você pode escrevê-lo assim (BSD / macOS find syntax):

find -E . -regex '.*/[^/]*([a-z])([A-Z])[^/]*'

O equivalente de URL do GNU seria algo como

find . -regextype posix-extended -regex '.*/[^/]*([a-z])([A-Z])[^/]*'
    
por 23.12.2016 / 22:01