Uso do operador Regex “OR” com o comando find

2

Existem muitas destas perguntas na net, mas não consegui resolver este problema simples.

Eu tenho um diretório com muitas imagens, mas só quero copiar um subconjunto deles identificado por intervalos de números. Cada foto tem o formato: " [random characters][capture number].BMP "

Por exemplo: IZ000561.BMP

Estou usando isso em conjunto com find e a opção -regex . A expressão regular que eu pensava usar era simples:

.*(26[2-7]|27[0-2]).*

se eu quisesse combinar imagens com uma tag de [262-267], [270-272]. Essa abordagem falhou, no entanto. Fui a um testador Regex on-line e correspondi conforme esperado usando essa expressão. Deve ser que o mecanismo de regex de find espere um formato diferente para esse tipo de filtragem.

O comando completo que eu estava usando:

find /path/to/images/ -regex ".*(26[2-7]|27[0-2]).*" -exec echo {} \;

O que é uma expressão válida para o que estou tentando fazer?

    
por sherrellbc 14.01.2016 / 18:48

3 respostas

3

Sei que você postou sua própria resposta, mas caso deseje usar a sintaxe REGEX, você pode alterar o tipo REGEX usando este comando:

-regextype TYPE

Então eu acredito em fazer o seu trabalho:

find /path/to/images/ -regextype sed -regex '.*(26[2-7]|27[0-2]).*' -exec echo {} \;

pode fazer o truque.

Além disso, apenas uma nota, sua regex corresponderá a qualquer coisa com 262-267 ou 270-272. Isso significa que vai pegar IZ262561.BMP , bem como IZ134267.JPG e ASDNASDNOANFOIAJFOIJDIO000262.EXE , por exemplo. Não tenho certeza sobre quais arquivos você está trabalhando, mas talvez seja necessário restringir seu regex, pois ele é bastante flexível em relação ao que ele aceita.

    
por 14.01.2016 / 19:06
2

Existe também um operador -or (ou -o ) no comando find . Você pode dividir sua expressão em duas subexpressões:

find /path/to/images/ -regex ".*(26[2-7]).*" -o -regex ".*(27[0-2]).*" -exec echo {} \;

-o é compatível com POSIX, enquanto -or não é:

De acordo com a página find man:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

   expr1 -or expr2
          Same as expr1 -o expr2, but not POSIX compliant.
    
por 14.01.2016 / 19:10
1

A leitura na página de manual de find fornece algumas informações úteis:

The regular expressions understood by find are by default Emacs Regular Expressions.

Então, dê uma olhada na sintaxe do Regex do Emacs

Parecequetodososcaracteresespeciaisprecisamterescapecom\.Levandoissoemconta,osresultadosesperadosforamobtidosapósaalteraçãodaexpressãoregularparaoseguinte:

find/path/to/images/-regex".*\(26[2-7]\|27[0-2]\).*" -exec echo {} \;

Eu consultei a página man antes de postar esta pergunta, mas aparentemente não meticulosamente o suficiente.

    
por 14.01.2016 / 19:00

Tags