使用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 }
如果我现在可以使用它,那么我可以慢慢地将它修改为我想要它做的事情.
感谢您提供给我的任何帮助.
解决方法
@H_502_32@ 首先,你必须使用相对路径,而不是绝对路径.否则你永远不会得到匹配.因此,如果“base”文件夹是/ Folder,那么文件/ Folder /子文件夹/文件应该表示为子文件夹/文件.下一步是加载两个哈希值,一个包含来自第一个位置的文件,另一个包含来自第二个位置的文件.使用相对路径作为键,然后值可以是可用于衡量“相等”的其他信息.修改时间,文件大小,或MD5 ……无论你想要什么.
然后,逐步执行第一个哈希中的所有键,检查第二个哈希中的每个键.如果它不存在,那么该文件不在第二个位置(新文件?).如果它确实存在,那么您可以检查相关值“相等”以查看文件是否已更新/更改.找到匹配项后,从第二个哈希中删除密钥.那么,第二个哈希中剩下的是第一个位置不存在的文件(已删除的文件?).
不过,这很棘手.如果你试图镜像,你必须认识到文件夹.如果您要添加文件,则必须先按排序顺序执行文件夹…例如所以你mkdir子文件夹/在尝试制作子文件夹/子文件夹2之前.
相反,如果您正在尝试删除内容,则必须撤消上述内容…首先删除文件,然后按降序排序顺序删除文件夹…例如在尝试rmdir子文件夹/之前删除子文件夹/子文件夹2.
最后,您还必须能够影响接收端文件的修改时间.将文件FTP到服务器时,它将获得当前时间.这意味着如果您使用MTIME作为判断文件是否为新文件的方法,它将永远不会再比较相等.并非所有FTP服务器都有更新文件时间的方法.
祝好运.最后,像rsync这样的东西是一个更好的解决方案.