Encontre o regex para o timestamp no filename não funcionando

0

Eu quero encontrar arquivos de mensagens no user maildir, sem mailfilter, dovecot-index etc.

Todos os arquivos de mensagens têm registro de data e hora em seus nomes de arquivos, acho que é a maneira mais fácil.

Eu usei este regex: .*\/\d{10}\..* . Funciona bem no testador link , mas não funciona na sequência de comandos de localização.

Sequência de comando completa: find /var/lib/exim4/mail/markelov -regextype sed -regex '.*\/\d{10}\..*' -type f

O escape em parênteses ( .*\/\d\{10\}\..* ) não funciona também.

Exemplos de cadeias: Deve encontrar:

/var/lib/exim4/mail/markelov/Maildir/.Sent/cur/1444787116.M8092P4423.mail,S=7264,W=7377:2,S
/var/lib/exim4/mail/markelov/Maildir/.Sent/cur/1445824988.M900660P25060.mail,S=422,W=434:2,S
/var/lib/exim4/mail/markelov/Maildir/.Trash/cur/1441681017.M637660P29838.mail,S=38938:2,Sa
/var/lib/exim4/mail/markelov/Maildir/.Trash/cur/1441934431.M919612P29838.mail,S=1447:2,Sa

Não deve encontrar:

/var/lib/exim4/mail/markelov/Maildir/.INBOX.zabbix.Alerts/maildirfolder
/var/lib/exim4/mail/markelov/Maildir/.INBOX.zabbix.Alerts/dovecot-uidlist
/var/lib/exim4/mail/markelov/Maildir/subscriptions
/var/lib/exim4/mail/markelov/Maildir/.INBOX.megaplan/dovecot.index

encontre --version

find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
    
por strangeman 03.12.2015 / 05:42

1 resposta

2

O problema é o \d , que não é entendido pelo sed regex, então você deve usar uma classe de caracteres de dígitos: [0-9] . Além disso, sed chaves para esse uso exigem barras invertidas precedentes. Em vez de:

.*\/\d{10}\..*

tente

.*\/[0-9]\{10\}\..*

Se você especificar -regextype posix-egrep , você usaria:

.*\/[0-9]{10}\..*

Existem muitas versões diferentes de expressões regulares. Eu aconselho você a encontrar a documentação do comando que você está usando para encontrar a sintaxe correta do regex.

Do site regxr.com:

RegExr uses your browser's RegExp engine for matching, and its syntax highlighting and documentation reflect the JavaScript RegExp standard.

O que explica em parte porque o regex não funcionou com o find.

    
por 03.12.2015 / 07:28