题目:比较2个文件夹, 判断并列出2个文件夹中重复的文件, 以及只存在某个文件夹的文件。
思路:我们需要判断是否重复, 因此选用hash来作为存储的数据结构比较合适。
我们先定义需要的变量:
my $folder1 = 'test'; my $folder2 = 'test2'; my %hash_same; my %hash_1; my %hash_2;
先读取其中一个文件夹, 创建目录句柄
opendir my $fd1, $folder1 or die "failed to open folder1\n";
依次读取文件夹中的文件, 存入hash中
while(my $file = readdir $fd1){
使用正则表达式过滤掉.开头的文件
next if $file =~ /^\./; $hash_1{$file} = 1; }
最后关闭文件句柄
closedir $fd1;
对于另一个文件夹, 使用同样的操作
opendir my $fd2, $folder2 or die "failed to open folder2\n"; while(my $file = readdir $fd2){ next if $file =~ /^\./; $hash_2{$file} = 1; } closedir $fd2;
循环遍历第一个文件夹中的文件, 针对每个文件, 判断其是否在第二个文件夹中, 如果存在, 则表示该文件同时存在于2个文件夹中, 则将其存入另一个预定义的hash中, 同时将其从2个文件夹各自的hash中删除。
这里需要指出的是, 删除hash中的元素, 不能简单的使用undef或者置成空值, 需要使用delete来删除特定的元素。
for my $file(keys %hash_1){ if($hash_2{$file}){ $hash_same{$file} = 1; delete $hash_1{$file}; delete $hash_2{$file}; } }
这样, 当我们遍历完第一个文件夹中的所有文件时, 第一个hash中剩下的元素,就是只存在于文件夹1中的文件, hash2中剩下的元素就是只存在于文件夹2中的文件。
最后我们依次打印出各个hash, 来显示我们的结果
print "in both folders: \n"; print keys %hash_same; print "\n"; print "only in folder1: \n"; print keys %hash_1; print "\n"; print "only in folder2: \n"; print keys %hash_2; print "\n";
这个方法其实还可以优化一下:
我们对于文件夹2中的文件, 不需要先读取所有的文件存入hash, 我们只需要依次遍历该文件夹中的文件, 然后直接去判断其是否存在于hash1中, 然后只需要存储不存在于hash1中的文件。这样我们只需要循环2次即可。