1

私は perl の初心者で、次の点で助けが必要です。

DirA と DirB には、ファイル f1 、f2 、f3 、f4、f5 があります (必ずしも 5 つではありません)。DirA の f1 の内容と DirB の f1 の内容を比較し、結果を f1_diff に出力する必要があります。同様に、ディレクトリ A と B のすべてのファイルに対してこれを行う必要があります。したがって、上記の場合、すべてのファイルの内容が異なると仮定すると、スクリプトは f1_diff、f2_diff、f3_diff、f4_diff、f5_diff の両方の f1 の行が欠落している 5 つのファイルを出力します。 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 に答える
0

並列が利用できる場合は簡単です:

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