디렉토리에서 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