Como usar o comando * nix find para procurar arquivos específicos com expressão regular

1

No meu centOS, há muitos arquivos de log na minha pasta / log

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3
/log/log.20120308.error
/log/log.20120308.error.1

Aparentemente, se eu usar o comando como abaixo

find /log -type f -iregex '.*/'log.20120308'.[0-9]*' -print

Eu só vou conseguir

/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Espero ter a expressão regular certa para obter a lista abaixo, mas não consigo

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Não consegui descobrir a expressão regular para selecionar a extensão .1, .2, .3 ou em branco

    
por forestclown 10.03.2012 / 03:16

2 respostas

3
find /log -type f -iregex '.*/'log.20120308'\(\.[0-9]*\)?' -print

o ? indica um ou nenhum, e você deve escapar do ponto (antes que o [0-9] desde o ponto combine com tudo ), então se você não escapar do ponto, você também obteria /log/log.20120308_1 no resultado se esse arquivo existir.

    
por 10.03.2012 / 03:53
2

Uma versão:

find /log -type f -iregex '.*/'log.20120308'[.0-9]*' -print

Claro, isso também selecionaria um arquivo chamado /log/log.20120308.. , mas não imagino que seja um problema provável.

Outra maneira seria usar -o como um operador "ou", com parênteses escapados em torno dos operandos:

find /log -type f \( -iregex '.*/'log.20120308'.[0-9]*' -o -iregex '.*/'log.20120308 \) -print

Ah, mais uma atualização para o uso de -iregex : você pode simplesmente citar um pouco, já que '.*/log.20120308.[0-9]*' selecionaria o mesmo que '.*/'log.20120308'.[0-9]*' . Juntando isso com a sugestão de @ md-gao, você pode obter esta versão:

find /log -type f -iregex '.*/log.20120308\(\.[0-9]\)?' -print
    
por 10.03.2012 / 03:52

Tags