orig |-a |- a.txt |-b |- b.txt |-c |- c.txt #### use strict; use warnings; use Archive::Zip; use File::Basename; use File::Copy::Recursive; use File::Find::Rule; use constant AZ_OK => 0; my $mkvingestdir = 'orig'; my $mkvingestdest = 'new'; my $zip_dest = 'zipped'; File::Copy::Recursive::dircopy $mkvingestdir, $mkvingestdest or die "copy failed: $!\n"; my @dirs = File::Find::Rule->directory() ->in($mkvingestdest); for my $dir (@dirs){ next if $dir =~ /(?:\.|\.\.)/; next if $dir eq $mkvingestdest; my $zip = Archive::Zip->new; $zip->addDirectory($dir); my $name = basename $dir; if ($zip->writeToFileNamed("$zip_dest/${name}.zip") != AZ_OK){ print "error in archive creation\n"; next; } print "archive created successfully\n"; } #### $ ls zipped/ a.zip b.zip c.zip