comando find com quantificador regex, por exemplo, {1,2}

13

Eu tenho tentado criar uma seqüência de comando find que encontrará todos os arquivos que terminam com um número de 1 a 99, mas exclui todos os outros.

por exemplo, eu quero encontrar meuarquivo1 meuarquivo99, mas não meuarquivo456 e não meuarquivo de backup

O regex que estou pensando é, myfile[1-9]{1,2}mas não consigo fazer isso funcionar com o find.

find . -regex '.*myfile[0-9]{1,2}' OU find . -iname 'myfile[0-9]{1,2}'

Pelo que vejo, é a {1,2}parte que não está funcionando.

(a propósito, você pode usar de forma -name -regexintercambiável?)

Qualquer ajuda apreciada.

Lukas88
fonte
1
-iname(e -name) use globs , que não possuem essa sintaxe.
L0b0 7/03

Respostas:

10

Você poderia tentar

find . -regex '.*myfile[0-9][0-9]?'

ou

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)
l0b0
fonte
Obrigado - a primeira linha está funcionando para mim. Eu tentei isso com -iname, mas acho que não suporta a sintaxe, ou então estou fazendo algo errado.
Lukas88, 7/03/2019
17

Se você encontrar o GNU, poderá usar outro tipo de expressão regular:

find . -regextype sed -regex '.*myfile[0-9]\{1,2\}'

De acordo com o GNU, findusa uma sintaxe de expressão regular do Emacs castrada por padrão - o Emacs suporta a sintaxe, mas pelo menos o GNU não a suporta.\{from,to\}find

Estranhamente, o manual de referência não inclui uma seção sobre a sedsintaxe da expressão regular, então quem sabe quais partes dele são suportadas.

l0b0
fonte
1
sedlike edparece ser um alias para posix-basic, então deve ser compatível com POSIX BRE (embora suporte algumas extensões como \+). Não é compatível com o GNU, sedpor exemplo, [\n]corresponde a uma nova linha em vez da barra invertida ou nexigida pelo POSIX. Veja também -regextype posix-extendedpara EREs POSIX (também .*myfile[0-9]{1,2}), também com extensões como \sou\<
Stéphane Chazelas 7/17
Eu nunca soube sobre -regextype. Parece que, se você usar -regextype egrep, pode evitar as barras invertidas.
Sridhar Sarnobat