所以我为自己想出了一个帮助学习Perl的小项目,这是我可以实际使用的东西。我们的想法是比较2个目录中的文件修改日期列表。 1来自FTP,我本地有1个,如果它们更新则从本地上传(这部分可以在以后处理)。我已经创建了单独的脚本(我计划将它们组合在一起,只是修补一下),一个用于从FTP读取目录并抓取文件。另一个比较2个目录中的文件列表(文件列表位于数组中),这是问题所在。我可以让它来比较两个目录。我似乎无法锻炼如何比较同名文件。如果只有一个目录中存在文件,它会将该文件与同一阵列位置的另一个文件进行比较。
使用if语句可以很容易地处理(我说很容易,但我不确定),但是无法理解哪些参数会这样做。
到目前为止我所拥有的:
opendir(IMD, "/TRAINING/Perl") || die("Cannot open directory");
@thefiles= readdir(IMD);
opendir(IMD2, "/TRAINING/Perl2") || die("Cannot open directory");
@thefiles2= readdir(IMD2)
foreach my $file (@thefiles) {
# if ($file != @thefiles2[$counter]){
if (compare($file, @thefiles2[$counter]) == 0){
print $file, " Matches ";
print @thefiles2[$counter], "\n";
$counter++;
}
# elsif ($file == @thefiles2[$counter]){
elsif (compare($file, @thefiles2[$counter]) != 0){
print $file, " ";
print "Does not match";
print @thefiles2[$counter], "\n";
$counter++;
}
}
目前我只是比较同一阵列位置的文件名,直到我能正常工作,然后将其更改为使用日期。已经使用-M但它正在做它现在正在做的事情。我意识到这远远不是我需要的东西,而且确实需要任何指针,特别是因为我的编程一般都是非常无声的。
基本上我想要它做什么,
If ($file1 !exists in $dir2){
Print "not exists"
}
If ($file1 exists in $dir2){
Compare its date with $file2 in $dir2 and print newer/older
}
如果我现在能够正常工作,那么我可以慢慢将其修改为我想要它做的事。
感谢您提供给我的任何帮助。
答案 0 :(得分:2)
首先,你必须使用相对路径,而不是绝对路径。否则你永远不会得到匹配。因此,如果“base”文件夹是/ Folder,那么文件/ Folder /子文件夹/文件应该表示为子文件夹/文件。
下一步是加载两个哈希值,一个包含来自第一个位置的文件,另一个包含来自第二个位置的文件。使用相对路径作为键,然后值可以是可用于衡量“相等”的其他信息。修改时间,文件大小,或MD5 ......无论你想要什么。
然后,您遍历第一个哈希中的所有键,检查第二个哈希中的每个键。如果它不存在,那么该文件不在第二个位置(新文件?)。如果它确实存在,那么您可以检查相关值“相等”以查看文件是否已更新/更改。找到匹配项后,从第二个哈希中删除密钥。那么,第二个哈希中剩下的是第一个位置不存在的文件(已删除的文件?)。
但是,这是一件棘手的事情。如果你试图镜像,你必须认识到文件夹。如果您要添加文件,则必须先按排序顺序执行文件夹...例如这样你就可以在尝试制作子文件夹/子文件夹2 /.之前使用mkdir子文件夹相反,如果您要删除内容,则必须撤消上述内容...首先删除文件,然后按降序排序删除文件夹...例如在尝试rmdir子文件夹/.
之前删除子文件夹/子文件夹2最后,您还必须能够影响接收端文件的修改时间。将文件FTP到服务器时,它将获得当前时间。这意味着如果您使用MTIME作为判断文件是否为新文件的方法,它将永远不会再比较相等。并非所有FTP服务器都有更新文件时间的方法。
祝你好运。最后,像rsync这样的东西是一个更好的解决方案。答案 1 :(得分:1)
首先,您不能依赖 readdir 返回有序列表的假设。因此,仅使用索引进行比较是错误的,即使您排序也无法依赖,因为可能存在其他目录中不存在的文件。此外,您的代码不适用于子目录。您可以使用的选项: