#!/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; }