Comando UNIX "find", correspondência literal "dot"

1

Eu preciso de arquivos que terminem com ".pdf" ou ".png"; aqui está minha tentativa:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*[pdf|png]'

isso inclui incorretamente os arquivos que terminam com "Apdf", "Zpdf", etc. (falta de um ponto literal antes da extensão do arquivo)

Eu tentei ajustar o padrão para:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'

mas nenhum resultado é retornado. Escapando o. com uma barra invertida não funciona. Por quê?

[0] $ uname -a

Darwin Robottinosino.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

Obrigado!

    
por Robottinosino 24.06.2012 / 16:43

6 respostas

3

O problema não é o ponto. São os suportes. Colchetes definem uma classe de caracteres; Tenho quase certeza de que o que você está tentando fazer é agrupar uma alternância. Para isso, você precisa de parênteses. Você precisa usar expressões regulares estendidas para isso, e assim o comando é:

find -E /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.(pdf|png)'

Esse -E flag é um BSDism (o OS X possui um grande número de usuários BSD-ish). No GNU find, você diz -regextype posix-extended , como uma expressão em vez de um sinalizador (de acordo com o comentário de Dennis Williamson , que está, sem dúvida, correta).

    
por 24.06.2012 / 16:48
5

Você pode usar apenas algo como \( -name '*.pdf' -or -name '*.png' \) , a menos que tenha outro motivo para combinar com um regex.

    
por 24.06.2012 / 16:46
2

O padrão [pdf|png] corresponde a qualquer um dos caracteres entre colchetes (incluindo o pipe).

Tente isto:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.\(pdf\|png\)'
    
por 24.06.2012 / 16:49
0
find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'
    
por 24.06.2012 / 16:49
0

Você deve usar -name *.pdf e não .*[pdf|png] .
Sua regex corresponderá a .Apdf , .Zpng etc.

Você pode tentar isto:
find . -type f | egrep '.pdf$|.png$'

    
por 24.06.2012 / 16:50
0

Isso deve ser adequado:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regextype posix-egrep -regex '.*\.(pdf|png)'

Se a sua versão de find não souber sobre -regextype posix-egrep , você poderá tentar isso:

find /Users/robottinosino/Desktop/_PublishMe_ -type f '.*\.\(pdf\|png\)'
    
por 24.06.2012 / 16:51