
〜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
。
次の方法を使用して、一致する項目がない各名前の行を追加できますoutfile
。allLogs.txt
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
find
何も見つからなくてもプロセスの交換が行われ、その場合はメッセージが印刷されます。
スペースを含むファイル名を管理できるようにfor loop
aに変更しました。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