UNIX에서 5일보다 오래된 파일 삭제(타임스탬프가 아닌 파일 이름의 날짜)

UNIX에서 5일보다 오래된 파일 삭제(타임스탬프가 아닌 파일 이름의 날짜)

디렉토리에서 5일이 지난 로그 파일을 삭제하고 싶습니다. 그러나 삭제는 파일의 타임스탬프를 기반으로 해서는 안 됩니다. 파일 이름을 기준으로 해야 합니다. 예를 들어, 오늘 날짜는 2012년 7월 5일이고 디렉터리에는 ABC_20120430.log, ABC_20120429.log등이라는 이름의 10개 파일이 포함되어 있습니다. 파일 이름에서 날짜를 추출하여 이러한 파일을 삭제할 수 있기를 원합니다 ABC_20120502.log.ABC_20120320.log

답변1

제 생각엔 @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

답변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

답변3

그것을 사용하는 한 가지 방법 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

답변4

당신이 할 수 있는 일은 파일 이름이 시간순으로 정렬된다는 사실을 활용하는 것입니다. 예를 들어, 마지막 5개 파일을 유지하려면 다음을 수행하세요.

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

관련 정보