Como encontrar arquivos que não contêm seu próprio nome de arquivo

Como encontrar arquivos que não contêm seu próprio nome de arquivo

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 0ou 1dependendo 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 shinvocaçã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).

informação relacionada