Удалить файлы старше 5 дней в UNIX (дата в имени файла, а не метка времени)

10

Я хочу удалить из каталога файлы журнала старше 5 дней. Но удаление не должно основываться на отметке времени файла. Он должен быть основан на имени файла. Например сегодняшней дата 07/05/2012 и каталог содержит 10 файлов имен , такие как ABC_20120430.log, ABC_20120429.log, ABC_20120502.log, и ABC_20120320.logт.д. Я хочу , чтобы иметь возможность удалить файлы путем извлечения даты из имени файла.

Nalu
источник

Ответы:

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
olibre
источник
Команды даты GNU не работают .. :( Любой другой способ получить дату, которая 5 дней назад?
Налу
7

Я думаю, что у @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
Гленн Джекман
источник
Команды даты GNU не работают .. :( Любой другой способ получить дату, которая 5 дней назад?
Налу
1
@Naren: на какой ОС ты? Если у вас нет даты GNU, нам нужно знать, что у вас есть.
Мат
С помощью uname -a получил следующую информацию: «SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, SPARC-Enterprise»
Налу,
Остается вопрос: какие команды доступны для получения текущей даты?
Брэм
Если установлен Tcl:four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh)
Гленн Джекман
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
Birei
источник
-1

Вместо этого вы можете использовать тот факт, что ваши имена файлов будут отсортированы в хронологическом порядке. Например, чтобы сохранить последние 5 файлов:

ls ABC_????????.log | head -n-5 | xargs rm
Томас
источник
3
Не используйте xargs, rmесли вы не знаете, что каждый раз убиваете котят. Это просто плохая идея, если вы не знаете, зачем проводить какие-то исследования и узнаете, что всегда есть лучшие способы решения любой проблемы, для которой это может быть решением.
Калеб