Как мне написать Perl-скрипт для вычисления суммы MD5 для каждого файла в каталоге?

Есть ли способ написать сценарий Perl для вычисления суммы MD5 каждого файла в каталоге?

Если да, то как я могу это сделать?


person Community    schedule 19.10.2013    source источник
comment
Получить список файлов в каталоге. Прочитайте каждую. Вычислите md5sum содержимого. Распечатайте это.   -  person hobbs    schedule 19.10.2013
comment
Как я могу получить доступ к команде ls из perl? Должен ли я читать содержимое списка в массив? Тогда можно ли использовать системную команду md5sum для каждого имени файла, хранящегося в массиве?   -  person    schedule 19.10.2013


Ответы (3)


Ну, есть много способов сделать это, но все сводится к двум операциям, которые вам нужно выполнить. Сначала вам нужно будет найти список файлов, которые вы хотите проверить, а затем вам нужно будет запустить проверку md5sum для каждого из этих файлов. Существует множество способов сделать это, но следующие должны работать для ваших нужд.

#!/usr/bin/perl

use strict;
use warnings;
use Digest::MD5 qw(md5_hex);

my $dirname = "/home/mgreen/testing/";
opendir( DIR, $dirname );
my @files = sort ( grep { !/^\.|\.\.}$/ } readdir(DIR) );
closedir(DIR);

print "@files\n";

foreach my $file (@files) {
    if ( -d $file || !-r $file ) { next; }
    open( my $FILE, $file );
    binmode($FILE);
    print Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n";
    close($FILE);
}

Вышеприведенное извлечет md5sum для каждого файла в каталоге, пропустит все подкаталоги и напечатает его в STDOUT. Часть контрольной суммы MD5 затем выполняется модулем Digest::MD5, что в конечном итоге и является тем, что я думаю, что вы ищете.

Мне нравится ваш вопрос, поскольку он не имеет ограничений и предлагает множество возможных решений, таких как «Как мне сделать это в Perl?» вопросы, поэтому я уверен, что вы получите много возможных решений, и я, скорее всего, обновлю свои, когда вернусь домой позже.

person MattSizzle    schedule 19.10.2013
comment
Приведенное выше будет получать md5sum для каждого файла в каталоге... Разве вы не вычисляете md5sum для имени файла, а не для файла? - person Kenosis; 19.10.2013
comment
Обычно лучше использовать glob, чем угловые скобки. - person stark; 19.10.2013
comment
@Kenosis, вы правы, и я изменил код. - person MattSizzle; 19.10.2013
comment
@stark да, это то, что я получаю за попытку ответить по телефону в автобусе. - person MattSizzle; 19.10.2013
comment
я только что попробовал это, и я не могу заставить его печатать $FILE и $file, если я не помещу этот скрипт в корневой каталог файлов. если я помещу эти сценарии в корень C:/, а затем установлю каталог в каталог файлов, которые мне нужно проверить, он будет печатать @files, но не будет печатать $FILE или $file - person james28909; 08.12.2013
comment
@MattGreen, как я могу настроить это так, чтобы оно проверяло каждый файл MD5 по массиву? - person james28909; 08.12.2013
comment
@ james28909 james28909, можете ли вы опубликовать это в новом вопросе в качестве продолжения этого вопроса? Существуют дополнительные детали, такие как то, что находится в массиве, которые потребуются для правильного ответа. - person MattSizzle; 30.06.2014

Может быть, использование find с -exec поможет?

find . -name "*.*" -exec md5sum '{}' \; 

'{}' будет заменено именем каждого файла.

person Rafael Oliveira    schedule 19.10.2013

Используйте opendir и readdir или другие recursive method. Вот пример:

#!/usr/bin/perl -w
use warnings;
my $DIR_PATH="a";
opendir DIR, ${DIR_PATH} or die "Can not open \"$DIR_PATH\"\n";
@filelist = readdir DIR;


foreach $file (@filelist) {
  open(IN,"a/$file")or die "cannot open";
  while(<IN>){...}
  close IN;
}
person YaleCheung    schedule 19.10.2013