Xóa các tệp cũ hơn 5 ngày trong UNIX (ngày trong tên tệp, không phải dấu thời gian)


10

Tôi muốn xóa các tệp nhật ký cũ hơn 5 ngày từ một thư mục. Nhưng việc xóa không nên dựa trên dấu thời gian của tệp. Nó nên được dựa trên tên của tập tin. Ví dụ ngày nay ngày là 07/05/2012 và thư mục chứa 10 file của những cái tên như ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logvv Tôi muốn để có thể loại bỏ các tập tin bằng cách chiết xuất ngày từ tên của tập tin.

Câu trả lời:


2

Dựa trên ngày từ tên tệp:

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

Các lệnh ngày GNU không hoạt động .. :( Có cách nào khác để lấy ngày trước 5 ngày không?
Nalu

7

Tôi nghĩ rằng @oHessling gần như có nó: Đừng phân tích ls và bạn có thể làm nhiều hơn trong 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

Các lệnh ngày GNU không hoạt động .. :( Có cách nào khác để lấy ngày trước 5 ngày không?
Nalu

1
@Naren: bạn đang dùng hệ điều hành nào? Nếu bạn không có thời gian GNU, chúng ta cần phải biết những gì bạn có.
Mat

Với sự giúp đỡ của uname -a đã nhận được thông tin sau: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu

Câu hỏi vẫn còn: những lệnh nào bạn có sẵn để có được ngày hiện tại?
Bram

Nếu Tcl được cài đặt:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
glenn jackman

1

Một cách sử dụng perl:

Nội dung của 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];
    }   
}

Để kiểm tra, tôi tạo một số tệp:

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

Kiểm tra chúng với ls -1:

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

Chạy đoạn script như:

perl script.pl *.log

Với đầu ra sau:

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

-1

Thay vào đó, những gì bạn có thể làm là sử dụng thực tế là tên tệp của bạn sẽ sắp xếp theo thứ tự thời gian. Ví dụ: để giữ 5 tệp cuối cùng:

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

3
Đừng sử dụng xargs rmtrừ khi bạn biết bạn đang giết mèo con mỗi khi bạn làm thế. Đó chỉ là một ý tưởng tồi, nếu bạn không biết tại sao thực hiện một số nghiên cứu và tìm hiểu rằng luôn có những cách tốt hơn để tiếp cận bất kỳ vấn đề nào mà đây có thể là một giải pháp cho.
Caleb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.