Как удалить дубликаты файлов, сравнив часть их имени и дату их изменения в Perl? - PullRequest
0 голосов
/ 16 февраля 2012

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

Проблема, с которой я сталкиваюсь, заключается в следующем: test12345.log, test34333.log, mytest11111.log, mytest22222.log и т. Д.Мне нужно удалить числовые значения в конце имени файла, а затем просто сравнить оставшиеся имена и дату изменения.test и test являются дубликатами, но какая из них имеет более старую измененную дату, поэтому я могу удалить ее?

Вот что я уже написал:

#!D:\Perl\bin\perl



opendir (DIR,".");
@array = grep(/.log/,readdir(DIR));
closedir (DIR);
foreach(@array){
    s/[0-9]{1}.log$//g;
    }

dlete(\@array);




sub dlete {
    my $array = shift;
    my $not_complete = 1;
    my $index;
    my $len = ((scalar @$array) - 2);
    while ($not_complete) {
        $not_complete = 0;
        foreach $index (0 .. $len) {
            if (@$array[$index] eq @$array[$index+1] && -M @$array[$index] > -M @$array[$index + 1]) {

                unlink "@$array[$index]";

                $not_complete = 1;
              }
       }
    }
}

Вопрос, который я задаю, выше кодировки.Я пытаюсь удалить дубликаты файлов из каталога, сравнивая их имена и дату изменения.Однако проблема в том, что имена файлов выглядят так: test12345.log, test34333.log mytest11111.log, mytest22222.log и т. Д. Мне нужно удалить числовые значения в конце имени файла, а затем просто сравнитьоставшиеся имена и дата изменения.например, test и test являются дубликатами, но у которых более старая модифицированная дата, поэтому я могу удалить ее

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Вот мое предложение для понимания вашей проблемы.

  1. Поместите короткие имена в хеш
  2. Проверьте для каждого файла, есть ли короткое имя в хэше.Если да, то
  3. сравните время mtime файла с значением в хэше, используя функцию stat
  4. , удалите старое, сохраните новое в хэше
  5. пожалуйста, проверьте Win32 :: UTCFileTime для правильного времени при использовании статистики.

     use autodie; # error handling
     my %files;
    
     opendir (my $dir,".");
     foreach my $file( grep(/.log/,readdir($dir))){
        my $shortname = shorten($file);
        if ($files{$shortname}) {
              if (stat($file)[9] > $files{$shortname}->{mtime}) {
                  unlink $files{$shortname}->{long};
                  $files{$shortname}->{long} = $file;
                  $files{$shortname}->{mtime} = stat($file)[9]
              } else {
                  unlink $file
              }
    
         }
      }    
      closedir ($dir);
    
0 голосов
/ 18 февраля 2012

Ваш текущий код выбрасывает полное имя; тогда вы не сможете найти информацию об изменениях только с part из имени файла. Совет Caldrin сохранить хэш-сопоставление коротких имен для длинных имен - хорошая идея (Его текущая реализация выключена, но идея верна.)

Ваш текущий код сокращения также немного неверен:

foreach(@array){
    s/[0-9]{1}.log$//g;
}

Это удалит только одну цифру из имени файла: {1}. Если каждая цифра стоит удалить, то следующее выполнит работу:

foreach(@array){
    tr /0-9//d;  # s/\d*//g would also work
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...