Tenho tentado criar uma string 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 Desejo localizar myfile1 myfile99 , mas não myfile456 e não myfilebackup

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

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

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

(a propósito você pode usar -name -regex alternadamente?)

Qualquer ajuda apreciada.

Comentários

  • -iname (e -name) use globs , que fazem não tem esta sintaxe.

Resposta

Você pode tentar

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

ou

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \) 

Comentários

  • Obrigado – a primeira linha é eu trabalho ng para mim. Eu tentei isso com -iname, mas não ' acho que ele suporta a sintaxe ou então eu ' estou fazendo algo errado.

Resposta

Se você tem GNU find, pode usar outro tipo de expressão regular:

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

De acordo com GNU find usa um castrado Sintaxe da expressão regular do Emacs por padrão – o Emacs oferece suporte à sintaxe \{from,to\}, mas pelo menos GNU find não é compatível.

Estranhamente, o manual de referência não inclui uma seção sobre a sed sintaxe da expressão regular, então quem sabe quais partes dela são suportados.

Comentários

  • sed como ed parece ser um alias para posix-basic, então deve ser compatível com POSIX BRE (embora suporte alguns ex tensões como \+). Ele ' não é compatível com GNU sed onde, por exemplo, [\n] corresponde a uma nova linha em vez de a barra invertida ou n exigida pelo POSIX. Veja também -regextype posix-extended para POSIX EREs (então .*myfile[0-9]{1,2}), também com extensões como \s ou \<
  • Nunca soube sobre -regextype. Parece que se você usar -regextype egrep, parece que você pode evitar as barras invertidas.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *