encontrar: expressão regular no nome

encontrar: expressão regular no nome

suponha que eu escreva:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

Este comando me parece que deveria funcionar. Eu iterei pelas várias opções de regextype e vários formatos de regex, mas não consigo fazer com que esse tipo de regex funcione através do find. Há algo simples que estou errado aqui em relação ao find e ao analisador de expressões regulares?

Responder1

Find's -namenão aceita expressões regulares (isso foi usado na versão original da pergunta). São necessários shell globs, e esse não é um shell glob válido. Você deseja usar o -regexteste, mas também precisa instruí-lo a usar expressões regulares estendidas ou qualquer outro tipo que entenda as notações {N}e . foo|barFinalmente, diferentemente do -name, o -regexteste analisa todo o nome do caminho, então você precisa de algo assim:

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

Se você quiser usar -name, você poderia fazer:

find . \( \
       -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
    -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
       \) -printf "%f\n"

Responder2

Outra opção é a fdferramenta:

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

Responder3

Se você tiver nomes de arquivos razoáveis ​​(pelo menos nesta pasta), poderá executar algo parecido com

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

Dessa forma, você pode se beneficiar de uma variedade de opções do grep.

informação relacionada