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
)