Удалите файлы, более старые, чем 5 дней в UNIX (дата в имени файла, не устанавливают метку времени),

Проблема решена теперь. Я сделал глупое предположение, что привязки клавиш были глобальны, когда на самом деле, они в расчете на пользователя. Я изменился, привязки клавиш вошли в систему как корень, но входили в сессию VNC, созданную другим пользователем. 'Скрываются, все нормальные окна …' ярлык был установлен на Mod4+D для этого пользователя. Стандартное решение — изменение его к чему-то еще, такое как Ctrl+Alt+D — решило проблему.

10
07.05.2012, 20:00
4 ответа

На основе даты от имени файла:

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
2
27.01.2020, 20:03
  • 1
    GNU, не работающие..:( Какой-либо другой способ получить дату, которая является за 5 дней до этого? команды даты –  Nalu 08.05.2012, 09:04

Я думаю, что @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
7
27.01.2020, 20:03
  • 1
    GNU, не работающие..:( Какой-либо другой способ получить дату, которая является за 5 дней до этого? –  Nalu 08.05.2012, 09:04
  • 2
    @Naren: на чем ОС Вы? Если у Вас нет даты GNU, мы должны знать то, что Вы действительно имеете. –  Mat 08.05.2012, 09:30
  • 3
    Со справкой uname-a получил следующую информацию: "SunOS badap01t 5.10 Generic_141444-09 sun4u sparc SUNW, Предприятие SPARC" –  Nalu 08.05.2012, 10:14
  • 4
    остается: какие команды Вы имеете в наличии для получения текущей даты? –  Bram 08.05.2012, 11:47
  • 5
    Если Tcl установлен: four_days=$(echo "puts [clock format [clock scan {4 days ago}] -format %Y%m%d]" | tclsh) –  glenn jackman 08.05.2012, 16:05

Один способ использовать 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
27.01.2020, 20:03

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

ls ABC_????????.log | head -n-5 | xargs rm
-1
27.01.2020, 20:03
  • 1
    Не используйте xargs с rm если Вы не знаете об уничтожении котят каждый раз, когда Вы делаете. Это - просто плохая идея, если Вы не знаете, почему проводят некоторое исследование и узнают, что всегда существуют лучшие способы приблизиться к какой-либо проблеме, для которой это могло быть решением. –  Caleb 07.05.2012, 15:43

Теги

Похожие вопросы