bin/imager.compress
changeset 62 24b1c19790bb
child 63 e6b2c98df64a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/imager.compress	Tue Aug 16 14:12:28 2011 +0200
@@ -0,0 +1,68 @@
+#! /usr/bin/perl
+
+use 5.010;
+use strict;
+use warnings;
+use POSIX qw(strftime);
+use autodie qw(:all);
+use File::Basename;
+use File::Temp;
+use IO::Compress::Gzip qw(gzip $GzipError :level :strategy);
+use IO::Uncompress::Gunzip qw(gunzip $GunzipError);
+use Hash::Util qw(lock_keys);
+use Getopt::Long;
+use Pod::Usage;
+use File::Find;
+
+use constant THRESHOLD => 0.90;
+use constant LEVEL => Z_BEST_SPEED;
+
+
+local $/ = undef;
+
+die if not @ARGV;
+
+find(sub {
+    say and return if -d;
+    return if not -f;
+
+    open(my $fh, $_);
+    my ($buffer, $zbuffer);
+    my ($tmp);
+
+    if (/\.gz$/ ) { 
+	$zbuffer = <$fh>;
+	gunzip(\$zbuffer => \$buffer)
+	    or die $GunzipError;
+
+	return if length($zbuffer)/length($buffer) < THRESHOLD;
+
+	$tmp = File::Temp->new(DIR => ".", TEMPLATE => ".tmp-XXXXXX");
+	print {$tmp} $buffer;
+	rename $tmp->filename => basename($_, ".gz");
+	
+    }
+    else {
+	$buffer = <$fh>;
+	gzip(\$buffer => \$zbuffer,
+	    -Minimal => 1,
+	    -Level => Z_BEST_SPEED,
+	    -Strategy => Z_FILTERED
+	) or die $GzipError;
+	return  if length($zbuffer)/length($buffer) >= THRESHOLD;
+
+	$tmp = File::Temp->new(DIR => ".", TEMPLATE => ".tmp-XXXXXX");
+	print {$tmp} $zbuffer;
+	rename $tmp->filename => "$_.gz";
+    }
+
+    say;
+
+    close $tmp;
+    unlink $tmp, $_;
+
+    return;
+
+
+}, @ARGV);
+