Список файлов старше одного дня в порядке, обратном времени модификации

Чтобы написать сценарий очистки каталога, мне нужно просмотреть все файлы старше одного дня. Кроме того, мне нужно удалить их в порядке, обратном времени модификации (сначала самые старые), пока не будет достигнут указанный размер.

Я пришел со следующим подходом к перечислению файлов:

find . -mtime +1 -exec ls -a1rt {} +

Я прав, что это не работает для большого количества файлов (поскольку будет выполнено более одного 'ls')? Как я могу достичь своей цели в этом случае?


person Manuel Barbe    schedule 17.03.2015    source источник


Ответы (2)


Вы можете использовать следующую команду, чтобы найти 10 самых старых файлов:

find . -mtime +1 -type f -printf '%T@ %p\n' | sort -n | head -10 | awk '{print $2}'

Используемые шаги:

  • Для каждого файла, возвращенного find, мы печатаем метку времени модификации вместе с именем файла.
  • Затем мы численно сортируем по отметке времени.
  • Сначала берем 10.
  • Мы печатаем только часть имени файла.

Позже, если вы захотите удалить их, вы можете сделать следующее:

rm $(...)

где ... — описанная выше команда.

person JuniorCompressor    schedule 17.03.2015

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

&CleanupDir("/path/to/directory/", 30*1024*1024);  #delete oldest files first in /path/to/directory/ until total size of files in /path/to/directory/ gets down to 30MB

sub CleanupDir {
  my($dirname, $dirsize) = @_;
  my($cmd, $r, @lines, $line, @vals, $b, $dsize, $fname);

  $b=1;
  while($b) {
    $cmd="du -k " . $dirname . " | cut -f1";
    $r=`$cmd`;
    $dsize=$r * 1024;

    #print $dsize . "\n";

    if($dsize>$dirsize) {
      $cmd=" ls -lrt " . $dirname . " | head -n 100";
      $r=`$cmd`;
      @lines=split(/\n/, $r);
      foreach $line (@lines) {
        @vals=split(" ", $line);
        if($#vals>=8) {
         if(length($vals[8])>0) {
            $fname=$dirname . $vals[8];
            #print $fname . "\n";
            unlink $fname;
          }
        }
      }
    } else {
       $b=0;
    }
  }
}
person mti2935    schedule 17.03.2015
comment
Примечание. Это приведет к удалению файлов партиями по 100 за раз. Вы можете увеличить или уменьшить это число в ls ... | руководитель.. команда в зависимости от ситуации. Также этот скрипт может работать некорректно, если имена файлов содержат пробелы или различные символы. - person mti2935; 17.03.2015