私はUnixを初めて使用します。複数のジョブの最新ログを見つけて、最新のログを削除しようとしています。
これに対するシェルスクリプトを書くことはできますか?デフォルトのコマンドを試しましたが、時間範囲を選択してログを削除していますが、返品便利なログを削除してください。
私が見つけたものを共有します。
touch -t 201903281325.00 start
touch -t 201903281331.00 stop
find . -newer start \! -newer stop -type f \( -name "**" -o -name "**" \) -exec rm -f {} \;
その時間内にすべてのファイルが削除されます。
私がしたいこと:
ジョブ名がA、B、Cなどで、これらのジョブが1日5回実行されるとします(例:A_1、A_2、A_3、B_1、B_2、B_3など)。
今日生成されたランニングログについて話してください。
Order_created_20190611_1.log
Order_created_20190611_2.log
Order_created_20190611_3.log
Order_zip_rec_20190611_1.log
Order_zip_rec_20190611_2.log
自動的に削除する必要がある項目:
Order_created_20190611_3.log
Order_zip_rec_20190611_2.log
自動的に見つけて削除しOrder_created_20190611_3.log
たいです。Order_zip_rec_20190611_2.log
役職の例:
Order_created
- 役職20190611
- 実行日_2
(最後の言及) - 実行回数。_2
今日のランニングは二度目という意味だ。
答え1
このような単純なファイル名の場合、改行文字などの奇妙な文字は含まれていないため、解析できますls
(通常は。推奨しない.)
あなたの質問で説明されているように、私たちはこれらのパターンと一致するファイルを処理すると仮定します。もちろん*
「すべて」が一致します。
Order_created_20190611_*.log
Order_zip_rec_20190611_*.log
また、今日の日付に基づくファイルの場合は、次のような「最新」ファイルを見つけることができます。
# Today's date in YYYYMMDD format
today="$(date +%Y%m%d)"
# Get "ls" to give us the files ordered by date modified (newest first). Pick off the first
newest="$(ls -t "Order_created_${today}_"*".log" | head -n1)"
# Show what we would delete (remove "echo" to action)
echo rm "$newest"
この原則を使用すると、複数のファイル名にわたってループにロールアップできます。
today="$(date +%Y%m%d)"
for prefix in Order_created Order_zip_rec
do
newest="$(ls -t "${prefix}_${today}_"*".log" 2>/dev/null | head -n1)"
[[ -f "$newest" ]] && echo rm "$newest"
done
ガイドライン
- 一般的に
ls
。sort
find
ls
一致するファイルがない場合は、エラー出力を放棄しました。rm
今回も削除するファイルがある場合にのみ試しました。
答え2
各タスクと日付グループの「最後」(最も高い番号の「実行」)ログファイルを削除するには、各組み合わせで表示される親タスクの実行を追跡し、削除するタスクを一覧表示するksh93ベースのソリューションを使用することをお勧めします。ファイル数:
#!/bin/ksh93
typeset -A highestjobruns=()
typeset -A deletions=()
for logfile in *_????????_*.log
do
base=${logfile%.log}
run=${base##*_}
jobdate=${base%_?}
if [ -z "${highestjobruns[$jobdate]}" ]
then
# no job runs found yet, this is it; nothing to delete yet
highestjobruns[$jobdate]=$run
else
# if this file has a higher run number, it's the new target for deletion
if [ "$run" -gt "${highestjobruns[$jobdate]}" ]
then
highestjobruns[$jobdate]=$run
deletions[$jobdate]=$logfile
fi
fi
done
printf 'Would rm: %s\n' "${deletions[@]}"
#rm -- "${deletions[@]}"
デフォルトのアイデアは、各潜在的なログファイルを繰り返し(好みに応じてワイルドカードを調整します。「何でも」、下線、6桁、下線、「何でも」、で終わる必要があります)、.log
実行番号とタスクの組み合わせと日付選択してから、いくつかの質問をしてください:
- このタスクの実行と日付の組み合わせを記録しましたか?そうでない場合は、それを文書化して続行してください。これは、シングルトンジョブの実行を削除しないことを意味します。
- 以前にこのジョブと日付の組み合わせの実行を見たことがある場合は、今見ている実行がこれまでに見た最高の実行よりも高いのでしょうか。その場合は、新しい実行番号を記録し、現在のファイルを削除した可能性があるファイルでいっぱいにします。同じジョブと日付の後続のログはこのエントリを上書きする可能性があるため、ジョブ名と日付ごとに1つのログファイルのみを削除します。
rm
最後に、削除したいファイルのサンプルコマンドを印刷します。必要に応じてコメントを付け、rm
削除のために実際のコマンド自体のコメントを削除します。