Perl 比较2个目录中文件的修改日期
所以我为自己设计了一个小项目来帮助学习Perl,这是我可以实际使用的东西。其思想是比较两个目录中的文件修改日期列表。1个来自FTP,1个来自my local,如果更新,则从local上传(此部分可稍后处理)。我已经创建了单独的脚本(我计划将它们结合起来,目前只是修补一下),一个用于从FTP读取目录并获取文件的脚本。另一个比较两个目录中的文件列表(文件列表位于一个数组中),这就是问题所在。我可以让它比较两个目录。我似乎不知道如何让它比较同名的文件。如果有文件只存在于其中一个目录中,它会将该文件与相同数组位置的另一个文件进行比较 使用if语句可以很容易地处理这个问题(我说很容易,但我不确定),但无法理解哪些参数可以做到这一点 到目前为止,我所拥有的:Perl 比较2个目录中文件的修改日期,perl,Perl,所以我为自己设计了一个小项目来帮助学习Perl,这是我可以实际使用的东西。其思想是比较两个目录中的文件修改日期列表。1个来自FTP,1个来自my local,如果更新,则从local上传(此部分可稍后处理)。我已经创建了单独的脚本(我计划将它们结合起来,目前只是修补一下),一个用于从FTP读取目录并获取文件的脚本。另一个比较两个目录中的文件列表(文件列表位于一个数组中),这就是问题所在。我可以让它比较两个目录。我似乎不知道如何让它比较同名的文件。如果有文件只存在于其中一个目录中,它会将该文件与相
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
}
如果我现在可以让它工作,那么我可以慢慢地修改它,使之符合我的要求
谢谢你们能给我的任何帮助 首先,您不能依赖于readdir返回有序列表的假设。所以,仅仅使用索引进行比较是错误的,即使您不能依赖排序,因为可能存在其他目录中不存在的文件。此外,您的代码不能使用子目录。您可以使用的选项:
- 使用Perl模块,例如。这允许使用子目录,您可以创建包含文件路径及其修改时间的哈希,该路径由stat
- 使用unix实用程序,如BSD
- 首先,您必须使用相对路径,而不是绝对路径。否则你永远也找不到匹配的。因此,如果“基本”文件夹是,比如说,/folder,那么文件/文件夹/子文件夹/文件应该表示为subfolder/file
下一步是加载两个哈希,一个包含第一个位置的文件,另一个包含第二个位置的文件。使用相对路径作为键,然后这些值可以是其他信息,您可以使用这些信息来衡量“相等性”。修改时间、文件大小或MD5。。。你要什么都行
然后,逐步遍历第一个散列中的所有键,在第二个散列中检查每个键。如果该文件不存在,则该文件不在第二个位置(新文件?)。如果该文件确实存在,则可以检查相关的“相等”值,以查看该文件是否已更新/更改。找到匹配项后,从第二个哈希中删除密钥。然后,第二个散列中剩下的是第一个位置中不存在的文件(删除的文件?)
不过,这是个棘手的问题。如果您尝试镜像,则必须了解文件夹。如果你要添加文件,你必须先按顺序排列文件夹。。。例如,在尝试创建子文件夹/subfolder2/之前,您可以使用mkdir subfolder/
相反地,如果你想移除东西,你必须颠倒上面的顺序。。。先删除文件,然后按降序删除文件夹。。。e、 g.在尝试rmdir subfolder/之前删除子文件夹/subfolder2/
最后,您还必须能够影响接收端上文件的修改时间。将文件FTP到服务器时,它将获取当前时间。这意味着,如果您使用MTIME作为判断文件是否为新文件的手段,它将永远不会再次比较相等。并非所有FTP服务器都有更新文件时间的方法
祝你好运。最后,像rsync这样的东西是一个更好的解决方案。你真的应该试着让你的问题更简短、更中肯。