【问题标题】:Perl script to compare file contents of dirA with file contents of dirB and output the difference in a separate filePerl 脚本将 dirA 的文件内容与 dirB 的文件内容进行比较,并将差异输出到单独的文件中
【发布时间】:2013-03-29 09:46:43
【问题描述】:

我只是 perl 的初学者,我需要以下方面的帮助。

DirA 和 DirB 有文件 f1 ,f2 ,f3 ,f4, f5 (数量不一定是 5)。我需要将 DirA 中 f1 的内容与 DirB 中 f1 的内容进行比较,并将结果输出到 f1_diff 中。同样需要对目录 A 和 B 中的所有文件执行此操作。因此在上述情况下假设所有文件的内容不同,脚本将输出 5 个文件 f1_diff,f2_diff,f3_diff,f4_diff,f5_diff 缺少 f1 的行DirA 和 f1 DirB。

例如,如果

f1 dir A has  line1, line2,     line3, line4xxxx, line5   
f1 dir B has  line1, line2xxxx, line3, line4,     line5 

f1_diff 应该有

line2 --> line2xxxx

line4xxxx -->line4    

谁能帮帮我。

更新: 我现在有以下脚本,需要添加以下内容。 文件名:# 不同的行 文件 1 – 1 文件 2 - 30 文件 3 – dir1 中缺失 文件 3a - 在 dir2 中丢失

其次是行数不同。有人可以帮我修改一下吗

#!/usr/bin/perl

package Main; { 
use strict;
use warnings;
use Cwd;
my $DirA;
my $DirB;
my $y;

print ("\nChoose one of the entries below\n");
print ("e1\e2\e3\n\n");

print("Enter here --->");
my $dir = <>;  
chomp($dir);    

if ($dir eq "e1"){

$DirA = "./dir1";
$DirB = "./dir2";
}

elsif ($dir eq "e2"){
$DirA = "./dir3";
$DirB = "./dir4";
}

else{
$DirA = "./dir5";
$DirB = "./dir6";
}

opendir my($dh), "$DirA" or die "Couldn't open dir DirA!";
my @files = readdir $dh;
closedir $dh;
system("rm -rf diffs");
system ("mkdir diffs");

foreach my $file (@files) {
    next if -d $file;
    my $diff = `diff -y --suppress-common-lines "$DirA/$file" "$DirB/$file"`;
    open DIFF_FILE, ">$file"."_diff";
    print DIFF_FILE $diff;
    close DIFF_FILE;#}
}
    chdir("./diffs/");
    my $cwd = cwd();
    system("mv ../*_diff .");
    foreach(glob('*.*')) {
    unlink if (-f $_) && !-s _;
}
 print("Total number of differences = "); system("ls *_diff | wc -l");print("\n");
 }

【问题讨论】:

    标签: perl file compare directory


    【解决方案1】:

    我推荐使用 CPAN 模块来完成这个任务:

    检查 Text::Diff 的输出格式是否是您需要的,它提供了配置功能

    【讨论】:

    • Text::Diff::OldStyle 和 Text::Diff:Table 看起来很合适。这种格式是我正在寻找的东西。但我需要一些代码方面的帮助
    • @Rancho :您需要先尝试自己编写代码...如果您需要进一步的帮助,请随时回复新问题。
    【解决方案2】:

    你可以使用Text::Diff

    #!/usr/bin/perl
    
    use Text::Diff;
    use strict;
    use warnings;
    
    opendir my($dh), "DirA" or die "Couldn't open dir DirA!";
    my @files = readdir $dh;
    closedir $dh;
    
    foreach my $file (@files) {
        next if -d $file;
        my $diff = diff "DirA/$file", "DirB/$file";
        open DIFF_FILE, ">$file"."_diff";
        print DIFF_FILE $diff;
        close DIFF_FILE;
    }
    

    【讨论】:

    • 非常感谢。实际上,当我使用“使用 Text::Diff”甚至“使用 File::Compare”或类似命令时,我收到一条错误消息 Can't locate Text/Diff.pm @INC 编译中止。我正在尝试在 unix 上运行此脚本。应该加点什么吗?
    • 你还没有安装这个包。如果您在 Windows 上使用 ActivePerl,请在 cmd 提示符下键入 ppm install Text::Diff;如果您使用 *nix,请使用 cpanm Text::Diff
    • 非常感谢会安装那个
    • 有没有办法在不使用使用 Text::Diff 或其他类似命令的情况下编写相同的内容?这是给某家公司的,它不允许我在服务器上安装任何东西?
    • 如果您使用 *nix,只需将 my $diff = diff "DirA/$file", "DirB/$file"; 替换为 my $diff = `diff "DirA/$file" "DirB/$file";`
    【解决方案3】:

    如果 parallel 可用就很容易了:

    ls dirA/f* | parallel 'echo {} - dirB/{/} >>{/}_dif ; diff {} dirB/{/} >> {/}_dif '
    

    【讨论】:

    • 谢谢西德哈特。我想我没有那个并行开关。我会在网上查一下,弄清楚如何安装
    • parallel可以从here下载,man page是here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多