2014-01-20 44 views
0

我有一個包含所有文件(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. 

需要幫助如何比較所有文件的校驗和的數組,並獲取文件名對於那些有相同的校驗

+0

您可以使用內置的'truncate',但你不應該僅僅依靠校驗和。在截斷它們之前,您應該確保通過比較兩個文件的實際內容與相同的校驗和。 – ikegami

+0

我會檢查文件名和它的校驗和的大小,如果兩者匹配,它們是相同的,也要確保你的校驗和適合大文件,所以我寧願使用SHA512而不是其他任何東西......順便說一句:你可以做你需要使用'sha512sum文件'更容易,並使用輸出作爲查找匹配的比較 – nrathaus

+0

正如所提到的File :: Checksum,使用'checksum'算法,並且對類似文件非常敏感,我將使用SHA512而不是校驗和爲您的任務 – nrathaus

回答

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"; 
    } 
} 

(未經測試)。

+0

工作正常..謝謝 –