Archive

Posts Tagged ‘sh’

How to batch-repair a directory with par2

September 9th, 2009 No comments

You can use this perl script.

$ mass-par2repair alt.binaries.*

Where arguments are directories, NOT files.

#!/usr/bin/perl -w

# Copyright (C) 2005 Anthony DeRobertis (netnews at derobert d0t net)

#

# This file is free software; you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation; either version 2 of the License, or

# (at your option) any later version.

# This file is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License

# along with this file; if not, write to the Free Software

# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

sub run_par(@);

my %results = ();

foreach my $dir (@ARGV) {

opendir DH, $dir or die “Could not open directory $dir: $!”;

my %par_files = ();

my %segment_files = ();

foreach my $file (readdir DH) {

my $base = undef;

if ($file =~ /.par2?$/i) {

if ($file =~ /^(.+)\.vol\d+\+\d+\.par2?$/i) {

$base = $1;

} elsif ($file =~ /^(.+)\.par2?/i) {

$base = $1;

} else {

die “Failed to find basename of $file.”;

}

push @{$par_files{$base}}, $file;

} elsif ($file =~ /^(.+)\.\d\d\d$/) {

$base = $1;

push @{$segment_files{$base}}, $file;

}

}

foreach my $key (keys %par_files) {

print “$key:\n “;

print join(“\n “, @{$par_files{$key}}), “\n”;

my @args = ();

foreach my $file (@{$par_files{$key}}, @{$segment_files{$key}}) {

push @args, “$dir/$file”;

}

my $retcode = run_par(@args);

if ($retcode == -1) {

die “Could not exec par2: $!”;

} elsif ($retcode == 0) {

#$results{$dir}->{$key} = ‘OK’;

print ” OK.\n\n”

} else {

$results{$dir}->{$key} = “FAILED ($retcode).”;

print ” FAILED ($retcode)\n\n”;

}

}

closedir DH;

}

print “\n\n\n”;

foreach my $dir (keys %results) {

print “SUMMARY FOR $dir:\n”;

foreach my $file (sort keys %{$results{$dir}}) {

print “\t$file: ” . $results{$dir}->{$file} . “\n”;

}

print “\n”;

}

sub run_par(@) {

my $pid = fork();

if ($pid == -1) {

return -1;

} elsif ($pid == 0) {

open STDOUT, ‘+>’, ‘/dev/null’ or die “> /dev/null failed: $!”;

exec {‘par2′} ‘par2′, ‘r’, ‘–’, @_;

die “Exec of par2 failed: $!”;

} else {

waitpid($pid, 0);

return $?;

}

}

########END OF PERL SCRIPT #############


As you noticed, I’ve messed up all the formatting but it still works. If you want the original file, contact the author, his address is in the headers.

So, to batch-repair everything in a directory you can also simply type :

for i in *.par2; do par2repair $i; done

This will work 99% of the time, since usually the first par2 file of the a set ( the smallest one ) is not capitalized, whereas the rest if them are.

To make it work 100% of the time, you can do this :

for i in *.[pP][aA][rR]2; do par2 r $i; done

But beware, this is a brutal, it will run par2repair everytime for every par2 file in the recovery set.

( thanks to the anonymous poster )

Please drop a comment if you have a question or new software to plug !

Advice for posting par2 and split files

September 9th, 2009 No comments

( Thanks a lot to “Nobody” @ a.b.m.a.d for this part! )

You don’t need a file splitter do it, the split command-line will do the job easily.

Posting rules :

* The split files must be a multiple of the par2 block-size, if not some blocks can be lost between two split files.

* The par2 block-size should be equal to the size of the article, or a multiple of it.

* Posting with Newspost constrains the article size to be a multiple of 45, and thus, so must be the Par2 block-size and the split file size.

Here’s an example of good settings :

# Par2 block-size : 225,000 bytes

# Article size : 225,000 bytes and 5000 lines

# Split files size : 9,000,000 bytes ( 40 articles )

#!/bin/sh

par2 create -s225000 $1

split –suffix-length=3 –numeric-suffixes –bytes=9000000 $1 $1′.’

Example of use :

$ sh parsplit.sh uberspanking.avi

To join the files back together and check them at the same time :

par2 r myfile.avi.par2 myfile.avi*

To post with Newspost, don’t forget to specify the good number of lines :

$ newspost …….. -l 5000 ……

Here’s another binary poster : yencee.

Please drop a comment if you have a question or new software to plug !

Split 001 002 files with Linux

September 3rd, 2009 No comments

Concatenation of multiple split files.

These split files are likely to be made by Quickpar users under windows, so the perfect way to assemble them is to use the par2 command line. ( from the parchive package )

par2 r myfile.par2 myfile.*

That way, all the split files will be considered as additionnal blocks, and it will check, repair, concatenate the files at the same time.

Note that it’s also possible to join the split files back together and then use the new file to find additionnal blocks. It takes one step more but it can save some processing time.

Sometimes the posters mistakenly create parity files that will repair the split files instead of the actual file, after repairing the split files use one of these sweet shell wildcard to merge them back together :

$ cat *.[0-9][0-9][0-9] >output.avi

If the split files are not the only ones in the folder :

$ cat yourfile.avi.[0-9][0-9][0-9] >yourfile.avi

or :

$ cat yourfile.avi.??? >yourfile.avi

This is very rare but sometimes .001 .002 .003 files are not split files but actual Rar multiple-part archives, in that case, unrar should do the job :

$ unrar e yourfile.avi.001

This only happened to me once in millions of Gigas of legal usenet binaries downloads hehe.

Please drop a comment if you have a question or new software to plug !