GNU/Linux >> Linux の 問題 >  >> Linux

最後のログファイル(アルファベット順)を除く古いログファイルを削除しますか?

次の形式のログファイルがいくつかあります:

log.2014-02-19-10_24_22

つまりlog.YYYY-MM-DD-H24_MI_SS

ログファイルの名前の一部である日付は、ログファイルが最初に作成されたときです。したがって、いつでも自分のディレクトリに次のログファイルを含めることができます。

log.2014-02-19-10_18_54
log.2014-02-19-10_21_20
log.2014-02-19-10_23_11
etc.

これで、cronjobによって呼び出され、「古い」ログファイルを削除するスクリプトができました。

$ cat delete-old-rotated-logs 
#!/usr/bin/env bash
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec rm {} ;

私が直面している問題は、ロギングのプロセスがクラッシュして、「最新の」ログファイルもしばらくすると(プロセスが書き込まれていないため)「古い」ものになり、削除されて、トレースが失われることです。 delete-old-rotated-logsを書き直すにはどうすればよいですか。 最後のファイル(または最後の N )以外の古いファイルを削除するようにスクリプトを作成します )?注文には、ファイル名自体または変更タイムスタンプ(より堅牢)の両方を使用できます。

承認された回答:

find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 |
  sort | head -n -1 | xargs rm

または、 mtimeを使用する場合 ファイル名の代わりに:

find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec ls -t {} + |
  tail -n +2 | xargs rm

@Stephaneのコメントから、より堅牢なアプローチは次のようになります。

IFS=$'n'
set -f
rm $(
  find /home/foo -maxdepth 1 -iname log* ! -name $'*n*' -type f -mmin +1800 |
  sort | head -n -1 )

またはPOSIXシェルの場合(GNUツールが必要です):

IFS='
'
ex_newline='*
*'
set -f
rm $(
  find /home/foo -maxdepth 1 -iname log* ! -name "$ex_newline" -type f -mmin +1800 |
  sort | head -n -1 )

単一の(堅牢な)パイプラインは、GNU sedの最新バージョンで使用できます。 /並べ替え (そしてGNUは上記のすべてと同じように見つけます):

find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -print0 |
  sort -z | sed -z '$d' | xargs -0 rm

Linux
  1. ディレクトリ内のすべてのファイルを削除する3つの方法(拡張子が付いた1つまたは少数のファイルを除く)

  2. 検索で特定のサブディレクトリを除くすべてのファイルを削除しますか?

  3. 最後を除くすべての改行をスペースに置き換えますか?

  1. 1 つを除くすべてのファイルを移動する

  2. アルファベット順に並べ替えたときに N 個のファイルを除くすべてを削除する Bash スクリプト

  3. LinuxのBashで一度に複数のファイルを削除するには?

  1. 1つのファイルを除くすべてのファイル/ディレクトリを削除しますか?

  2. Sed:最初の文字列を除く文字列のすべての出現を削除しますか?

  3. 最後の x 個のファイルを保持し、残りを削除する bash スクリプトの何が問題になっていますか?