localizar arquivos com padrão de correspondência de nome de base ao retornar caminho completo

0

Preciso corresponder os resultados de 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.

Eu preciso corresponder todos os arquivos de todos os diretórios terminados em xxx.txt , em que xxx tem três dígitos e apenas os nomes de arquivos que não são precedidos pela palavra pure_ . Além disso, preciso retornar o caminho completo.

Eu tenho todos trabalhando, 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 disser /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.

Então, provavelmente, resume-se a como corresponder em um caminho completo um nome de base que não comece 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.

    
por leosenko 12.03.2018 / 17:01

3 respostas

1

Você pode apenas dizer a find para excluir arquivos que começam com pure_ e também o grep com a expressão -regex :

find ./path -mindepth 1 -maxdepth 2 -type f ! -name 'pure_*' -regex '.*\.[0-9][0-9][0-9].txt$'

Com cópias em um diretório simulado do seu exemplo, recebo:

./path/1/file1.001.txt
./path/1/file2.001.txt
./path/2/file3.002.txt
    
por 12.03.2018 / 17:04
3

find sem correspondência de expressão regular:

find /path -type f ! -name 'pure_*' -name '*[0-9][0-9][0-9].txt'

Isso localizará qualquer arquivo regular no diretório /path , cujo nome não comece com pure_ , mas termine com três dígitos e .txt .

    
por 12.03.2018 / 17:42
0
find -type f | egrep "[0-9]{3}\.txt$" | grep -v pure_

O find procura por arquivos que começam no seu diretório atual.

O egrep aplica regexps estendidos, filtrando por três dígitos acrescentados por ".txt" (os pontos precisam ser ignorados, caso contrário "Atxt" também corresponderia ao final de uma linha.

O grep filtra as linhas ( -v ) com a string "pure_" (não tenho certeza se o local do "pure_" é importante).

    
por 12.03.2018 / 17:17