#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use constant INDENT_PLUS => ' ';
use File::Spec;
use IO::Compress::Zip qw{zip $ZipError};
my $dir = '/home/ken/tmp/pm_11150213_zip_dirtree';
my $re = qr{00$};
comp00($dir, $re);
sub comp00 {
my ($dir, $re, $indent) = @_;
$indent = '' unless defined $indent;
print "$indent** Dir: '$dir'\n";
opendir(my $dh, $dir);
for my $file (grep ! /^(?:\.|\.\.)$/, readdir $dh) {
my $path = File::Spec::->catfile($dir, $file);
print "$indent* Path: '$path'\n";
if (-f $path) {
if ($path =~ $re) {
eval {
my $zip = "$path.zip";
zip $path, $zip or die $ZipError;
print "${indent}Zipped: '$path'\n";
unlink $path;
print "${indent}Deleted: '$path'\n";
1;
}
or do {
my $err_msg = $@;
print "${indent}FAILED! $err_msg\n";
};
}
else {
print "${indent}Skipped: '$path' (doesn't match pattern '$re')\n";
}
}
elsif (-d _) {
print "${indent}Recurse: '$path' is a directory\n";
comp00($path, $re, $indent . INDENT_PLUS);
}
else {
print "${indent}Skipped: '$path' (not plain file or directory)\n";
}
}
closedir $dh;
return;
}
####
ken@titan ~/tmp/pm_11150213_zip_dirtree
$ rm -rf a d
ken@titan ~/tmp/pm_11150213_zip_dirtree
$ mkdir -p a/b a/c d/e d/f/g
ken@titan ~/tmp/pm_11150213_zip_dirtree
$ for dir in a a/b a/c d d/e d/f d/f/g; do > $dir/x00; > $dir/y; > $dir/z01; done
####
ken@titan ~/tmp/pm_11150213_zip_dirtree
$ ./compress00.pl
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/.compress00.pl.swp'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/.compress00.pl.swp' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/a' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/a'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/b/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/c/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/a/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/compress00.pl'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/compress00.pl' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/d' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/d'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/e/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g'
Recurse: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g' is a directory
** Dir: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/g/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/f/z01' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/x00'
Zipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/x00'
Deleted: '/home/ken/tmp/pm_11150213_zip_dirtree/d/x00'
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/y'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/y' (doesn't match pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/z01' (doesn't match pattern '(?^:00$)')