Estou brincando com o comando find para ver como ele se comporta e estou um pouco perdido.
O primeiro bit está bom:
find . -maxdepth 1 -exec grep -l abc {} \;
grep: .: Is a directory
./file2.pdf
./file1
Em seguida, tento excluir o arquivo .pdf encadeando outro comando egrep, mas falho.
find . -maxdepth 1 -exec grep -l abc {} \; -exec egrep -vl '*.pdf' {} \;
grep: .: Is a directory
./file2.pdf
./file2.pdf
./file1
./file1
Por que não exclui o arquivo .pdf e também imprime o resultado duas vezes?
egrep -vl '*.pdf' some_file
examina o conteúdo do arquivo , não o nome.A maneira correta de excluir nomes com
find
é negar ( ) uma expressão!
adequada-name
(ou se disponível).-iname
Exemplo:Cada resultado foi impresso duas vezes porque após o primeiro
grep
imprimi-lo e retornar com sucesso, o segundo (egrep
) aparentemente não encontrou*.pdf
(interpretado como uma expressão regular estendida) no respectivo conteúdo do arquivo e assim (lembre-se do-v
) imprimiu o mesmo nome.Nota
-exec
também é um teste. No seu caso, se o primeiro-exec
relatar falha, o segundo-exec
não será acionado. O primeiro-exec
relatará falha segrep
relatar falha. E ogrep
irá relatar falha se não encontrar o padrão no arquivo. Isso significa que qualquer arquivo que não for impresso pelo primeirogrep
não poderá ser impresso pelo segundo (egrep
) porque o segundo nem roda para o arquivo.Outra maneira de excluir
.pdf
arquivos é filtrar a saída do seu primeirofind
(que no seu caso é de fato a saída degrep
s; suafind
impressão não é nada por si só). Assim:Mas se qualquer caminho retornado por
find
for multi-linha (ou seja, se incluir novas linhas; nomes de arquivos no Linux podem), então o adicionadogrep
perceberá cada linha separadamente de qualquer maneira, como se as linhas se referissem a mais de um arquivo; e você obterá resultados inesperados. Portanto, testar dentrofind
(-name …
) é melhor.