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 -name
nã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 -regex
teste, mas também precisa instruí-lo a usar expressões regulares estendidas ou qualquer outro tipo que entenda as notações {N}
e . foo|bar
Finalmente, diferentemente do -name
, o -regex
teste 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 fd
ferramenta:
fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'
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.