Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 比较2个目录中文件的修改日期_Perl - Fatal编程技术网

Perl 比较2个目录中文件的修改日期

Perl 比较2个目录中文件的修改日期,perl,Perl,所以我为自己设计了一个小项目来帮助学习Perl,这是我可以实际使用的东西。其思想是比较两个目录中的文件修改日期列表。1个来自FTP,1个来自my local,如果更新,则从local上传(此部分可稍后处理)。我已经创建了单独的脚本(我计划将它们结合起来,目前只是修补一下),一个用于从FTP读取目录并获取文件的脚本。另一个比较两个目录中的文件列表(文件列表位于一个数组中),这就是问题所在。我可以让它比较两个目录。我似乎不知道如何让它比较同名的文件。如果有文件只存在于其中一个目录中,它会将该文件与相

所以我为自己设计了一个小项目来帮助学习Perl,这是我可以实际使用的东西。其思想是比较两个目录中的文件修改日期列表。1个来自FTP,1个来自my local,如果更新,则从local上传(此部分可稍后处理)。我已经创建了单独的脚本(我计划将它们结合起来,目前只是修补一下),一个用于从FTP读取目录并获取文件的脚本。另一个比较两个目录中的文件列表(文件列表位于一个数组中),这就是问题所在。我可以让它比较两个目录。我似乎不知道如何让它比较同名的文件。如果有文件只存在于其中一个目录中,它会将该文件与相同数组位置的另一个文件进行比较

使用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
}
如果我现在可以让它工作,那么我可以慢慢地修改它,使之符合我的要求


谢谢你们能给我的任何帮助

首先,您不能依赖于readdir返回有序列表的假设。所以,仅仅使用索引进行比较是错误的,即使您不能依赖排序,因为可能存在其他目录中不存在的文件。此外,您的代码不能使用子目录。您可以使用的选项:

  • 使用Perl模块,例如。这允许使用子目录,您可以创建包含文件路径及其修改时间的哈希,该路径由stat
  • 使用unix实用程序,如BSD

    • 首先,您必须使用相对路径,而不是绝对路径。否则你永远也找不到匹配的。因此,如果“基本”文件夹是,比如说,/folder,那么文件/文件夹/子文件夹/文件应该表示为subfolder/file

      下一步是加载两个哈希,一个包含第一个位置的文件,另一个包含第二个位置的文件。使用相对路径作为键,然后这些值可以是其他信息,您可以使用这些信息来衡量“相等性”。修改时间、文件大小或MD5。。。你要什么都行

      然后,逐步遍历第一个散列中的所有键,在第二个散列中检查每个键。如果该文件不存在,则该文件不在第二个位置(新文件?)。如果该文件确实存在,则可以检查相关的“相等”值,以查看该文件是否已更新/更改。找到匹配项后,从第二个哈希中删除密钥。然后,第二个散列中剩下的是第一个位置中不存在的文件(删除的文件?)

      不过,这是个棘手的问题。如果您尝试镜像,则必须了解文件夹。如果你要添加文件,你必须先按顺序排列文件夹。。。例如,在尝试创建子文件夹/subfolder2/之前,您可以使用mkdir subfolder/

      相反地,如果你想移除东西,你必须颠倒上面的顺序。。。先删除文件,然后按降序删除文件夹。。。e、 g.在尝试rmdir subfolder/之前删除子文件夹/subfolder2/

      最后,您还必须能够影响接收端上文件的修改时间。将文件FTP到服务器时,它将获取当前时间。这意味着,如果您使用MTIME作为判断文件是否为新文件的手段,它将永远不会再次比较相等。并非所有FTP服务器都有更新文件时间的方法


      祝你好运。最后,像rsync这样的东西是一个更好的解决方案。

      你真的应该试着让你的问题更简短、更中肯。