UNIXで5日より古いファイルを削除する(タイムスタンプではなくファイル名の日付)


10

5日以上経過したログファイルをディレクトリから削除したい。ただし、削除はファイルのタイムスタンプに基づくべきではありません。ファイルの名前に基づいている必要があります。例今日の日付が2012年7月5日で、ディレクトリのような名前の10個のファイルが含まれているためにABC_20120430.logABC_20120429.logABC_20120502.logABC_20120320.logなどのIをファイル名から日付を抽出してファイルを削除できるようにしたいです。

回答:


2

ファイル名の日付に基づく:

THRESHOLD=$(date -d "5 days ago" +%Y%m%d)
ls -1 ABC_????????.log | 
  sed 'h;s/[_.]/ /g;G;s/\n/ /' | 
  while read A DATE B FILE
  do 
     [[ $DATE -le $THRESHOLD ]] && rm -v $FILE
  done

?5日前の日付を取得する。.. :(他の方法では動作しないGNU日付コマンド
ナル

7

私は@oHesslingがほぼそれを持っていると思います:lsを解析しないでください、そしてあなたはbashでより多くを行うことができます:

four_days=$(date -d "4 days ago" +%Y%m%d)
for f in ABC_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].log; do
  date=${f#ABC_}
  date=${date%.log}
  (( $date < $four_days )) && rm "$f"
done

?5日前の日付を取得する。.. :(他の方法では動作しないGNU日付コマンド
ナル

1
@ナレン:どのOSを使用していますか?GNUの日付がない場合、私たちはあなたがを持っているを知る必要があります。
マット

uname -aの助けを借りて、次の情報を入手しました: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW、SPARC-Enterprise"
Nalu

質問は残ります:現在の日付を取得するために利用できるコマンドは何ですか?
ブラム

Tclがインストールされている場合:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
glenn jackman

1

使用する1つの方法perl

内容script.pl

use warnings;
use strict;
use Time::Local qw/timelocal/;
use File::Spec;

## Process all input files.
while ( my $file = shift @ARGV ) { 

    ## Remove last '\n'.
    chomp $file;

    ## Extract date from file name.
    my ($date) = $file =~ m/.*_([^.]+)/ or next;

    ## Extract year, month and day from date.
    my ($y,$m,$d) = $date =~ m/(\d{4})(\d{2})(\d{2})/ or next;

    ## Get date in seconds.
    my $time = timelocal 0, 0, 0, $d, $m - 1, $y - 1900 or next;

    ## Get date in seconds five days ago.
    my $time_5_days_ago = time - 5 * 24 * 3600;

    ## Substract them, and if it is older delete it and print the
    ## event.
    if ( $time - $time_5_days_ago < 0 ) { 
        unlink File::Spec->rel2abs( $file ) and printf qq[%s\n], qq[File $file deleted];
    }   
}

テストするために、いくつかのファイルを作成します。

touch ABC_20120430.log ABC_20120502.log ABC_20120320.log ABC_20120508.log ABC_20120509.log

それらを確認してくださいls -1

ABC_20120320.log                                                                                                                                                                                                                             
ABC_20120430.log                                                                                                                                                                                                                             
ABC_20120502.log                                                                                                                                                                                                                             
ABC_20120508.log                                                                                                                                                                                                                             
ABC_20120509.log                                                                                                                                                                                                                             
script.pl

次のようにスクリプトを実行します。

perl script.pl *.log

次の出力で:

File ABC_20120320.log deleted
File ABC_20120430.log deleted
File ABC_20120502.log deleted

-1

代わりにできることは、ファイル名が時系列でソートされるという事実を利用することです。たとえば、最後の5つのファイルを保持するには:

ls ABC_????????.log | head -n-5 | xargs rm

3
rm毎回子猫を殺していることがわかっているのでない限り、xargsを使用しないでください。なぜ調査を行い、これが解決策となり得る問題にアプローチするためのより良い方法が常にあることを知っているなら、それは単に悪い考えです。
カレブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.