cpi
changeset 9 571516885a72
equal deleted inserted replaced
8:2a3c9c60bed1 9:571516885a72
       
     1 #! /usr/bin/perl
       
     2 use 5.014;
       
     3 use strict;
       
     4 use warnings;
       
     5 
       
     6 my $BS = 4 * 4096;
       
     7 
       
     8 die "Usage: $0 INFILE OUTDEV\n" unless @ARGV == 2;
       
     9 
       
    10 my ($inf, $outf) = @ARGV;
       
    11 
       
    12 my $in;
       
    13 
       
    14 if ($inf eq '-') { open($in, '<&STDIN') or die "$0: Can't open <&STDIN: $!\n" }
       
    15 else { open($in, '<', $inf) or die "$0: Can't open <$inf: $!\n" }
       
    16 
       
    17 open(my $out, '+<', $outf) or die "$0: Can't open +>$outf: $!\n";
       
    18 
       
    19 $/ = \$BS;
       
    20 
       
    21 {
       
    22     my ($read, $skipped, $written) = (0, 0, 0);
       
    23     my $t0 = time;
       
    24 
       
    25 while (defined ($_ = <$in>)) {
       
    26     ++$read;
       
    27 
       
    28     my $lastpos = tell $out;
       
    29     my $block = <$out>;
       
    30 
       
    31     if (defined $block and $block eq $_) {
       
    32 	++$skipped;
       
    33 	next;
       
    34     }
       
    35 
       
    36     seek($out, $lastpos, 0) or die "$0: Can't seek: $!\n";
       
    37     print {$out} $_;
       
    38 
       
    39     ++$written;
       
    40 
       
    41 } continue {
       
    42     my $dt = time - $t0;
       
    43     printf "\rskipped: %5.1fM, written: %5.1fM written, speed: %5.1fM/s", 
       
    44 	    $skipped * $BS / 2**20, 
       
    45 	    $written * $BS / 2**20, 
       
    46 	    $dt ?  $read * $BS / 2**20 / $dt : 0;
       
    47 }
       
    48 
       
    49     say "\nDONE";
       
    50 
       
    51 }