如果文件具有相同的校验和,则使文件大小为零

时间:2014-01-20 13:44:39

标签: perl

我有一个包含所有文件(C文件)路径的数组。

我正在使用Perl

@array

C:\temp\a.c
C:\temp\b.c
C:\temp\x.c
C:\temp\y.c
C:\temp\z.c

少数文件虽然具有不同的文件名,但可能具有相同的校验和(这意味着它们具有相同的内容)。这些只存在成对。我必须将其中一个的大小设为0。

CODE

use File::Checksum;

my %array;
foreach my $k(@files3)
{                       
      $array{$k} = Checksum($k, 100);   
}

# have to check if they have same checksum and make those file to size 0

#making file size to 0 is easy. 
#I just have to open file in write mode and then close it.

需要帮助来比较数组中所有文件的校验和,并为具有相同校验和的文件获取文件名

1 个答案:

答案 0 :(得分:1)

创建哈希“数组”令人困惑。将其命名为“哈希”不那么容易混淆,但“独特”或“校验和”之类的东西可能会更好。

使用校验和作为密钥,而不是文件名:

my %checksum;
for my $f (@files) {
    push @{ $checksum{ Checksum($f, 100) } }, $f;
}

数组的哈希现在包含按校验和分组的所有文件。删除重复项:

for my $ch (keys %checksum) {
    my @same = @{ $checksum{$ch} };
    if (@same == 2) {
        open my $FH, '>', $same[1] or die $!;
    } elsif (@same > 2) {
        warn "More than 2 files: @same. None deleted.\n";
    }
}

(未测试)。