Hapus file yang lebih lama dari 5 hari di UNIX (tanggal dalam nama file, bukan cap waktu)


10

Saya ingin menghapus file log yang lebih lama dari 5 hari dari direktori. Tetapi penghapusan tidak harus didasarkan pada timestamp file. Itu harus didasarkan pada nama file. Untuk Contoh todays date adalah 07/05/2012 dan direktori berisi 10 file dari nama-nama seperti ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logdll saya ingin dapat menghapus file dengan mengekstraksi tanggal dari nama file.

Jawaban:


2

Berdasarkan tanggal dari nama file:

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

Perintah tanggal GNU tidak berfungsi .. :( Adakah cara lain untuk mendapatkan tanggal yang 5 hari sebelumnya?
Nalu

7

Saya pikir @ oHessling hampir memilikinya: Jangan parsing ls , dan Anda dapat melakukan lebih banyak di 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

Perintah tanggal GNU tidak berfungsi .. :( Adakah cara lain untuk mendapatkan tanggal yang 5 hari sebelumnya?
Nalu

1
@ Naren: OS apa yang Anda pakai? Jika Anda tidak memiliki tanggal GNU, kami perlu tahu apa yang Anda miliki.
Mat

Dengan bantuan uname -a mendapat info berikut: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu

Pertanyaan tetap: perintah apa yang Anda miliki untuk mendapatkan tanggal saat ini?
Bram

Jika Tcl diinstal:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
glenn jackman

1

Salah satu cara menggunakan perl:

Isi dari 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];
    }   
}

Untuk mengujinya saya membuat beberapa file:

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

Periksa dengan ls -1:

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

Jalankan skrip seperti:

perl script.pl *.log

Dengan output sebagai berikut:

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

-1

Yang bisa Anda lakukan adalah menggunakan fakta bahwa nama file Anda akan diurutkan dalam urutan kronologis. Misalnya, untuk menyimpan 5 file terakhir:

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

3
Jangan gunakan xarg dengan rmkecuali Anda tahu Anda membunuh anak kucing setiap kali Anda melakukannya. Itu hanya ide yang buruk, jika Anda tidak tahu mengapa melakukan riset dan belajar bahwa selalu ada cara yang lebih baik untuk mendekati masalah apa pun yang bisa menjadi solusi.
Caleb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.