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
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
comoed
parece ser um alias paraposix-basic
, então deve ser compatível com POSIX BRE (embora suporte alguns ex tensões como\+
). Ele ' não é compatível com GNUsed
onde, por exemplo,[\n]
corresponde a uma nova linha em vez de a barra invertida oun
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.
-iname
(e-name
) use globs , que fazem não tem esta sintaxe.