procura arquivos de log recursivamente e imprime “INVALID” se nenhum log for encontrado (bash)

0

Eu tenho ~ 750 diretórios de log Eu preciso procurar o arquivo de log mais recente disponível:

Eles são capturados pelo arquivo allLogs.txt e cada entrada contém um caractere curinga '*', de modo que APENAS o registro com a data mais recente é obtido (pode haver muitos registros com o mesmo nome e datas diferentes. por exemplo,

import_Asbeg_DA_Config3 _ *. log

import_test_deploy _ *. log

import_Plus_DQ_Config1 _ *. log

por exemplo. Eu sei que isso não é bonito, mas funciona muito bem para realizar o objetivo em um loop.

for LATEST in 'cat allLogs.txt' ;
do
    find -name "${LATEST}" -type f | sort -n | tail -1

done < infile > outfile

Isso encontra ~ 350 registros porque todos os diretórios podem não ter um arquivo de log.

"allLogs.txt" contém todos os ~ 750 caminhos para o arquivo de log desse diretório.

O que estou tentando descobrir como executar esse comando no meu loop MAS manter a consistência mesmo se nenhum arquivo de log for encontrado. Talvez anexando 'INVALID' aos registros que NÃO contêm um arquivo de log. Eu tentei combinações de eco com o comando find mas sem sorte. Alguma ideia?

    
por SSDdude 28.11.2018 / 14:53

3 respostas

0

Tudo muito obrigado com a ajuda!

"printf" é meu amigo!

Este código funcionou para resolver o meu ... outfile mantém a integridade da linha de ~ 750 ... outfile é um pouco confuso, mas nada que não pode ser processado com algum awk, sed, etc.

 for LATEST in 'cat ${TMPDIR}/AllLogs.txt' ;
    do
      printf "'echo ${LATEST}' 'find -name "${LATEST}" -type f | sort -n | tail -1'\n"

    done < infile > outfile
    
por 29.11.2018 / 15:55
1

Como em a resposta que você já tem , presumo que você tenha muitos diretórios, cada um contendo zero ou mais arquivos cujos nomes são compostos por uma parte comum mais um número para ordenação e que as partes comuns desses nomes são listadas em seu arquivo allLogs.txt .

Você pode usar algo assim para adicionar uma linha a outfile para cada nome em allLogs.txt que não tenha correspondências encontradas por find :

#!/bin/bash

while read -r LATEST; do
  find -name "${LATEST}" -type f | tee >( [ "$(wc -l)" = 0 ] && printf '%s\n' "${LATEST} INVALID" )  | sort -n | tail -1
done < allLogs.txt > outfile

tee e a substituição do processo será executada mesmo se find não encontrar nada, nesse caso uma mensagem será impressa.

Alterei o for loop para while loop para permitir que ele gerencie nomes de arquivos com espaços. O redirecionamento de entrada é alterado de acordo, mas isso pode não ser o que você deseja. De qualquer forma, não é relevante para a sua questão principal (como adicionar o aviso "INVÁLIDO").

    
por 28.11.2018 / 16:11
1

Com base na sua pergunta, acho que o que você está realmente perguntando é imprimir o arquivo mais recente no diretório, se houver algum arquivo no diretório. Se não houver arquivos em nenhum diretório, imprima INVALID, ou algo semelhante.

Se o acima for um resumo correto, você pode adicionar uma cláusula if ao seu loop que verifica se há apenas uma única linha gerada quando você faz uma descoberta nesse diretório. Se houver apenas uma única linha, esse é o diretório. Portanto, não há arquivos. Você pode pular qualquer outro comando dentro do loop e continuar para o próximo item na lista.

Aqui está o script atualizado:

#!/bin/bash

for LATEST in $(cat allLogs.txt); do
    if [[ $(find ${LATEST} -print | wc -l) -eq 1 ]]; then
        echo "${LATEST} has no files"
        continue
    fi
    find ${LATEST} -type f | sort -n | tail -1
done

exit 0

Eu não queria apenas imprimir INVALID porque você não saberia qual diretório estava imprimindo INVÁLIDO.

Eu não sabia por que você estava redirecionando stdin para o loop. Eu não redirecionei o stdout, mas isso é fácil de adicionar.

    
por 28.11.2018 / 15:09