UNIX에서 5 일이 지난 파일을 제거합니다 (타임 스탬프가 아닌 파일 이름의 날짜).


10

디렉토리에서 5 일이 지난 로그 파일을 삭제하고 싶습니다. 그러나 삭제는 파일의 타임 스탬프를 기반으로하지 않아야합니다. 파일 이름을 기반으로해야합니다. 예 오늘 날짜가 2012년 7월 5일과 디렉토리가 같은 이름의 파일 10 건 포함를 들어 ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_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

GNU 날짜 명령이 작동하지 않습니다. : : (5 일 전에 날짜를 얻는 다른 방법은?
Nalu

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

GNU 날짜 명령이 작동하지 않습니다. : : (5 일 전에 날짜를 얻는 다른 방법은?
Nalu

1
@Naren : 어떤 OS를 사용하고 있습니까? GNU 날짜가 없다면, 우리는 당신이 가진 것을 알아야 합니다 .
Mat

uname의 도움으로 다음 정보를 얻었습니다. "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu

질문이 남아 있습니다 : 현재 날짜를 얻기 위해 어떤 명령을 사용할 수 있습니까?
Bram

티클가 설치되어있는 경우 :four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
글렌 잭맨

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를 사용하지 마십시오 . 왜 일부 연구를 수행하고 이것이 해결책이 될 수있는 모든 문제에 접근 할 수있는 더 좋은 방법이 있다는 것을 알지 못한다면 나쁜 생각입니다.
Caleb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.