G'day justin423,
Here's how you could do this in a single pass using only core features.
I've included verbose output so you can see what's going on: you may not want some, or any, of this.
In production, the $dir and $re values would be supplied via arguments, options, config file, or similar.
Also, I've aimed for Perl v5.8; there are various improvements you could make with a more recent version
— feel free to ask if you're unsure what those might be (stating, of course, the Perl version you're using).
#!/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 patter
+n '$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 direct
+ory)\n";
}
}
closedir $dh;
return;
}
For testing, I created /home/ken/tmp/pm_11150213_zip_dirtree then ran the following to set up test directories and files.
Sorry, I don't know the equivalent MS-DOS commands.
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; > $di
+r/z01; done
Here's the output from a sample run:
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' (d
+oesn'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 director
+y
** 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' (does
+n'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 director
+y
** 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' (does
+n'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 matc
+h pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/a/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/a/z01' (doesn't ma
+tch 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 director
+y
** 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' (does
+n'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 director
+y
** 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 di
+rectory
** 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' (does
+n'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 matc
+h pattern '(?^:00$)')
* Path: '/home/ken/tmp/pm_11150213_zip_dirtree/d/z01'
Skipped: '/home/ken/tmp/pm_11150213_zip_dirtree/d/z01' (doesn't ma
+tch pattern '(?^:00$)')
|