次の形式のログファイルがいくつかあります:
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