Ao usar modelos para gerar arquivos, é importante incluir o nome do modelo dentro do modelo. Ao ler um arquivo gerado, ajuda a encontrar o modelo usado para gerá-lo.
Quero procurar todos os modelos em um diretório que não contenha seu próprio nome de arquivo, imprimir os que encontrar e sair com um código diferente de zero, se algum for encontrado.
Até agora, foi isso que eu descobri.
find . -name "*.xyz" -exec sh -c 'grep -L $(basename {}) {}' \;
Isso localiza e imprime os arquivos com êxito, mas sai com um código de saída 0, independentemente de algum arquivo ser encontrado ou não. Como posso encontrar os arquivos relevantes e sair com um código diferente de zero quando algum for encontrado?
Responder1
Como posso encontrar os arquivos relevantes e sair com um código diferente de zero quando algum for encontrado?
Canalize o resultado para grep ''
. A ferramenta não altera o fluxo de texto, mas gera status de saída 0
ou 1
dependendo se alguma linha passa por ele ou não.
Eu sei que você quer o contrário. Se eu fosse você, me acomodaria ao comportamento dele grep
. Meu raciocínio é: você quer saber os arquivos que atendem aos seus critérios; o comando os encontra, entãoconseguepara descobrir se há pelo menos um arquivo.
No entanto, se você insistir no comportamento oposto, apenasnegar o status de saída. Exemplo:
! find . -name "*.xyz" -exec sh -c 'grep -L "$(basename "$1")" "$1"' sh {} \; | grep ''
Observe que depurei sua sh
invocação dentro do arquivo find
. Sua abordagem original seria um tiro pela culatra se {}
expandida para ./a;rm -rf ~;.xyz
(é um nome de arquivo válido em muitos sistemas de arquivos Linux).
Responder2
Talvez algo como grep .... && <do if found> || <do if not found>
faça o trabalho
Responder3
for f in *.xyz; do
grep -q $f $f || echo "$f does not contain itself"
done
Ele lhe dará a lista de arquivos que você está procurando, embora ainda retorne um zero (porque o eco foi bem-sucedido).