#!/usr/bin/env perl use strict; if (@ARGV and $ARGV[0] eq "--help") { print q(This script will test magicrescue on existing files on your hard disk to see if your recipe is good enough. It can be very useful when creating or modifying a recipe. Usage: ./magicrescue -Mio OPTIONS FILES|tools/checkrecipe [OPTIONS] Options: -s VALUE Size tolerance, in percent. Specifies when checkrecipe should complain about the output file size being different from the input. Usage examples: find / -name \*.png -print0 \ |xargs -0 ./magicrescue -Mio -r png -d /tmp/test-output 2>/dev/null \ |tools/checkrecipe or slocate \*.png|sed "s/['\"\\\\[:blank:]]/\\\\\\\\&/g" \ |xargs ./magicrescue -Mio -r png -d /tmp/test-output 2>/dev/null \ |tools/checkrecipe ); exit; } my $size_tolerance = 0; while (defined(my $arg = shift(@ARGV))) { if ($arg eq "-s") { $size_tolerance = shift(@ARGV)/100; } else { die "$0: Unknown option $arg. Use --help for usage info.\n"; } } my ($curfile, $cur_ok); while () { if (/^i (.*)$/) { if ($curfile and !$cur_ok and -s $curfile) { print "$curfile: not extracted\n"; } $curfile = $1; $cur_ok = 0; } elsif (/^o (.*)$/) { my $outfile = $1; if ($curfile and $cur_ok) { print "$curfile: extracted again\n"; } else { my ($insize, $outsize) = (-s $curfile, -s $outfile); if ($size_tolerance >= 0 and $insize and -f $outfile and abs($outsize - $insize)/$insize > $size_tolerance) { print "$curfile: is $insize bytes, extracted $outsize bytes\n"; } } $cur_ok = 1; unlink $outfile or warn "unlinking $outfile: $!"; } }