私は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
今回も削除するファイルがある場合にのみ試しました。