encontra o arquivo newermt e o conteúdo do arquivo grep não funciona

0

Estou tendo problemas com os comandos find e grep do Linux. Basicamente eu preciso de CD para um diretório, recursivo encontrar todos os arquivos exemplo.txt modificados após uma data específica e, em seguida, executar o grep nesses arquivos. O comando abaixo está funcionando (um pouco), mas dá vários resultados do mesmo arquivo e não tenho certeza de como ele é estável.

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
    
por Vitaliy Terziev 12.01.2018 / 18:27

2 respostas

1
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;

Isso seria find , iniciando no diretório atual ./ , arquivos com o -nome example.xml que são mais recentes (em tempo de modificação) do que 2018-01-01 e para cada um deles, executem o comando grep -r "videoplayer.1" /. .

Mas vemos que o comando grep não leva em conta o nome do arquivo encontrado por find , mas o comando é sempre constante. Além disso, inicia uma busca recursiva ( -r ) da raiz do sistema de arquivos ( /. ). Agora, isso pode ser um erro de digitação ( ./ vs. /. ), mas o significado muda completamente.

Mesmo com grep -r ... ./ , a pesquisa seria recursiva a partir do diretório atual e, com -exec , esse é o diretório em que find foi iniciado.

Com find -exec , você precisa usar o espaço reservado {} para informar find onde inserir o nome do arquivo sendo processado no momento. Então

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep  "videoplayer.1" {} \;

Para executar grep videoplayer.1 filename em todos os arquivos denominados example.xml que sejam mais recentes que 1º de janeiro de 2018.

Na verdade, você pode substituir o \; que termina o comando -exec com + para que find passe vários arquivos para uma invocação de grep . Isso tornaria todo o trabalho mais rápido, já que menos processos precisam ser iniciados:

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep  "videoplayer.1" {} \+

Além disso, se você quiser ter certeza de que grep lista o nome do arquivo que está processando, você pode usar o sinalizador -H (pelo menos no GNU e no BSD grep ):

  -H, --with-filename       

Print the file name for each match. This is the default when there is more than one file to search.

(Uma alternativa para -H seria adicionar algo como /dev/null à lista de arquivos dados a grep )

    
por 13.01.2018 / 01:25
2

Eu acho que a forma correta desse comando é:

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" {} \;

Ausente a parte {} no comando find . Seus resultados de busca não estão sendo passados para o grep.

    
por 12.01.2018 / 18:38

Tags