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-filenamePrint 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 )