find . -type f -name '*.md' -exec \
sh -c 'sed 1d\;q "$1" | grep -qvx "author: Mr. Xab Ycd"' sh {} \; -print
O comando acima inclui todos os requisitos sem ter que passar nomes de arquivos potencialmente confusos por meio de canais de shell.
A primeira parte é copiada como é (quase) da sua - procure arquivos com o nome *.md
. Eu mudei as aspas duplas para "simples" aspas simples; não há diferença funcional no seu caso, mas se você quisesse procurar arquivos com o nome *.$md
, aspas duplas tentariam expandir a variável $md
.
Os nomes de arquivos correspondentes são então passados por outro teste via -exec
. O parâmetro para exec é um script de shell pequeno cujo trabalho é determinar o sucesso ou a falha do nome de arquivo fornecido em $1
. O comando sed
imprime apenas a linha dois; Existem diferentes maneiras de fazer isso, como:
-
sed -n '2{p;q;}'
ou -
sed '1d;q
O primeiro diz "não imprima linhas por padrão, mas quando você vir a linha dois, imprima e saia". O segundo diz "imprimir linhas por padrão, mas exclua a linha um, pare depois disso (na linha dois); o comando q
imprimirá o buffer atual antes de sair.
Essa linha de texto (se houver) é passada ao grep, que verifica se a linha inteira corresponde (ou não) ao texto fornecido. Se não corresponder ( -v
), o comando inteiro será bem-sucedido e, portanto, find
imprimirá o nome do arquivo.