use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); use File::Find qw(find); my $startdir = 'foo'; our $zip = Archive::Zip->new(); my $dir_member = $zip->addDirectory( '04campaigndashboard/' ); $dir_member->desiredCompressionLevel( 9 ); find(\&wanted,$startdir); sub wanted { ($fn = $File::Find::name) =~ s/$startdir//; if ($fn =~ /.zip/) { ???? } else { my $file_member = $zip->addFile( $fn ); } return; }