ログファイルを繰り返し検索し、ログがない場合は「INVALID」を印刷します(bash)。

ログファイルを繰り返し検索し、ログがない場合は「INVALID」を印刷します(bash)。

〜750個のログディレクトリがあり、利用可能な最新のログファイルを検索する必要があります。

これはallLogs.txtファイルとしてキャプチャされ、各エントリにはワイルドカード "*"が含まれており、最新の日付のログのみがクロールされます(日付が異なり、同じ名前のログが多数ある場合があります)。

import_Asbeg_DA_Config3_*.log

import_test_deploy_*.log

import_Plus_DQ_Config1_*.log

たとえば、これは良くないことがわかりますが、目標を達成するためのループには非常に効果的です。

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

done < infile > outfile

すべてのディレクトリにログファイルがない可能性があるため、約350レコードを探します。

"allLogs.txt"には、このディレクトリのログファイルへの〜750のパスがすべて含まれています。

このコマンドをループで実行しているときにログファイルが見つからない場合でも、一貫性を維持する方法を見つけたいと思います。ログファイルを含まないレコードに「invalid」を追加することもできます。私はechoとfindコマンドの組み合わせを試しましたが、成功しませんでした。どんなアイデアがありますか?

答え1

あなたの質問によると、あなたが実際に要求するのは、ディレクトリ内の最新のファイルを印刷することです(ディレクトリにファイルがある場合)。ディレクトリにファイルがない場合は、INVALID などの内容を印刷します。

上記の要約が正しい場合は、ループにif句を追加して、そのディレクトリを表示したときに1行しか出力されないことを確認できます。一行だけあればそれが目次です。したがって、文書はありません。その後、ループ内の他のコマンドをスキップしてリスト内の次の項目を続行できます。

更新されたスクリプトは次のとおりです。

#!/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

INVALIDを印刷するディレクトリがわからないので、INVALIDを印刷したくありません。

ループの標準入力をリダイレクトする理由が何であるかよくわかりません。 stdoutをリダイレクトしませんが、追加するのは簡単です。

答え2

のようにすでに持っている答え、私はあなたが多くのディレクトリを持っていると仮定します。各ディレクトリには、名前が共通部分とソート用の数字で構成されるゼロ個以上のファイルが含まれており、これらの名前の共通部分がファイルにリストされているとしますallLogs.txt

次の方法を使用して、一致する項目がない各名前の行を追加できますoutfileallLogs.txtfind

#!/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

teefind何も見つからなくてもプロセスの交換が行われ、その場合はメッセージが印刷されます。

スペースを含むファイル名を管理できるようにfor loopaに変更しました。while loopその結果、入力リダイレクトは変更されますが、目的の結果ではない可能性があります。とにかく、これはあなたの主な質問(「間違った」通知を追加する方法)とは何の関係もありません。

答え3

助けてくださった皆さん、本当にありがとうございました!

「printf」は私の友達です!

このコードは私の元の問題を解決しました。

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

    done < infile > outfile

関連情報