#!/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$)')