UNIX'te 5 günden eski dosyaları kaldırın (dosya adındaki tarih, zaman damgası değil)


10

Bir dizinden 5 günden daha eski günlük dosyalarını silmek istiyorum. Ancak silme, dosyanın zaman damgasına dayanmamalıdır. Dosyanın adına dayanmalıdır. Örneğin bugünün tarihi 07.05.2012 olup dizin gibi isimlerin 10 dosyaları içerir için ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, ABC_20120320.logvb ben dosyanın adından tarihini çıkararak dosyaları kaldırmak için isterler.

Yanıtlar:


2

Dosya adından tarihe göre:

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 tarih komutları çalışmıyor .. :( 5 gün önce tarih almanın başka bir yolu var mı?
Nalu

7

Bence @oHessling neredeyse sahip: ls ayrıştırmayın ve bash daha fazlasını yapabilirsiniz:

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 tarih komutları çalışmıyor .. :( 5 gün önce tarih almanın başka bir yolu var mı?
Nalu

1
@Naren: Hangi işletim sistemindesiniz? GNU tarihiniz yoksa, neye sahip olduğunuzu bilmemiz gerekir.
Mat

Uname yardımı ile aşağıdaki bilgileri aldım: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise"
Nalu

Soru kalıyor: Geçerli tarihi almak için hangi komutlarınız var?
Bram

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

1

Kullanmanın tek yolu perl:

İçeriği 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];
    }   
}

Test etmek için bazı dosyalar oluşturuyorum:

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

Bunları kontrol edin ls -1:

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

Komut dosyasını aşağıdaki gibi çalıştırın:

perl script.pl *.log

Aşağıdaki çıktı ile:

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

-1

Bunun yerine, dosya adlarınızın kronolojik olarak sıralanacağı gerçeğini kullanın. Örneğin, son 5 dosyayı saklamak için:

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

3
rmHer yaptığınızda yavruları öldürdüğünüzü bilmiyorsanız xargs'ı kullanmayın . Bu sadece kötü bir fikir, neden biraz araştırma yapıyorsanız ve bunun bir çözüm olabileceği herhangi bir soruna yaklaşmanın her zaman daha iyi yolları olduğunu öğreniyorsanız.
Caleb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.