ลบไฟล์ที่เก่ากว่า 5 วันใน UNIX (วันที่ในชื่อไฟล์ไม่ใช่เวลาประทับ)


10

ฉันต้องการลบไฟล์บันทึกที่เก่ากว่า 5 วันจากไดเรกทอรี แต่การลบไม่ควรยึดตามเวลาประทับของไฟล์ มันควรจะขึ้นอยู่กับชื่อของไฟล์ สำหรับวันที่ตัวอย่างในปัจจุบันเป็น 2012/07/05 และไดเรกทอรีมี 10 ไฟล์ชื่อเช่นABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logฯลฯ ฉันต้องการที่จะสามารถที่จะลบไฟล์โดยแยกวันจากชื่อของไฟล์

คำตอบ:


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 date ไม่สามารถใช้คำสั่ง .. :( วิธีอื่นในการรับวันที่ 5 วันก่อน?
Nalu

7

ฉันคิดว่า @oHessling มีเกือบแล้ว: อย่าแยก lsและคุณสามารถทำอะไรได้มากกว่าในการทุบตี:

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 date ไม่สามารถใช้คำสั่ง .. :( วิธีอื่นในการรับวันที่ 5 วันก่อน?
Nalu

1
@ นาเรน: คุณใช้ระบบปฏิบัติการอะไรอยู่ หากคุณไม่มีวัน GNU เราจำเป็นต้องรู้ว่าคุณมีอะไร
จ้า

ด้วยความช่วยเหลือของ uname -a ได้รับข้อมูลต่อไปนี้: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu

คำถามยังคงอยู่: คุณมีคำสั่งอะไรบ้างเพื่อรับวันที่ปัจจุบัน
Bram

หากติดตั้ง Tcl:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
glenn jackman

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
อย่าใช้ xargs ด้วยrmเว้นแต่คุณจะรู้ว่าคุณกำลังฆ่าลูกแมวทุกครั้งที่ทำ มันเป็นความคิดที่ไม่ดีถ้าคุณไม่รู้ว่าทำไมทำวิจัยและเรียนรู้ว่ามีวิธีที่ดีกว่าในการแก้ไขปัญหาที่อาจเป็นวิธีแก้ปัญหา
Caleb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.