use strict;
use warnings;
use feature 'say';
use File::Copy;
use File::Spec::Functions;
use File::Find::Rule;
use File::Path qw(make_path);
use Cwd;
my $pwd = cwd();
my $dir = catdir($pwd,'source');
my $rule = File::Find::Rule->new;
$rule->file;
$rule->maxdepth(1);
my @files = $rule->in($dir);
foreach my $file (@files) {
my ($extension) = ($file =~ m/.+\.(.+)/);
my $subdir = catdir($dir,$extension);
if (!(-d $subdir)) {make_path($subdir);}
copy($file,$subdir);
}
####
source
test1.gif
test1.pdf
test1.txt
test2.gif
test2.pdf
test2.txt
test3.gif
test3.pdf
test3.txt
####
source
test1.gif
test1.pdf
test1.txt
test2.gif
test2.pdf
test2.txt
test3.gif
test3.pdf
test3.txt
gif
test1.gif
test2.gif
test3.gif
pdf
test1.pdf
test2.pdf
test3.pdf
txt
test1.txt
test2.txt
test3.txt