Eu preciso combinar os resultados find
com regexp. Os arquivos são como:
/path/1/file1.001.txt
/path/1/file2.001.txt
/path/1/file1.001
/path/2/file3.002.txt
/path/2/pure_file3.002.txt
etc.
Preciso corresponder a todos os arquivos de todos os diretórios que terminam em xxx.txt
onde xxx
estão 3 dígitos e apenas os nomes de arquivos que não são precedidos por palavra pure_
. Além disso, preciso retornar o caminho completo.
Eu tenho tudo funcionando, exceto excluindo os arquivos precedidos por pure_
:
find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.*\.[0-9]{3}.txt'
Eu tentei:
find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.+(?!pure).*\.[0-9]{3}.txt'
mas se eu fizer isso diga /path/1/
:
ls -1 | grep -P '^(?!pure).*\.[0-9]{3}.txt'
que exclui corretamente esses arquivos, por outro lado:
ls -1 | grep -P '(?!pure).*\.[0-9]{3}.txt'
não.
Portanto, provavelmente se resume a como corresponder em um caminho completo a um nome de base que não começa com pure_
. Minha compreensão de expressões regulares é insuficiente para isso, pode ter algo a ver com a atomicidade de olhar ao redor que eu nunca entendi.
find
sem correspondência de expressão regular:Isso encontrará qualquer arquivo regular dentro ou sob o
/path
diretório cujo nome não comece compure_
, mas termine com três dígitos e.txt
.Você poderia apenas dizer
find
para excluir arquivos que começam compure_
, e também fazer ogrep
com a-regex
expressão:Com cópias em um diretório simulado do seu exemplo, obtenho:
O
find
procura por arquivos começando em seu diretório atual.Aplica regexps
egrep
estendidos, filtrando por três dígitos acrescentados por ".txt" (os pontos precisam ser escapados, caso contrário, "Atxt" também corresponderia), no final de uma linha.Os
grep
filtros afastam (-v
) as linhas com a string "pure_" (não tenho certeza se o lugar do "pure_" é importante).