1

我只是 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");
 }
4

3 回答 3

3

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

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

于 2013-04-07T07:46:32.307 回答
1

你可以使用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;
}
于 2013-04-07T08:01:18.800 回答
0

如果并行可用,这很容易:

ls dirA/f* | parallel 'echo {} - dirB/{/} >>{/}_dif ; diff {} dirB/{/} >> {/}_dif '
于 2013-04-07T08:18:36.810 回答