Вы не упомянули, как вы храните имена файлов, которые будут использоваться для переименования, поэтому я предполагаю, что это общий тип изменений, например "file_x" -> "file_x_foo". Вы должны определить это сами.
Этот сценарий попытается переименовать все файлы в каталоге, предполагая, что единственный обычный файл в каталоге - это целевой файл. Если у вас есть больше файлов в каталоге, вам нужно будет предоставить средство идентификации этого файла.
Скрипт принимает необязательный аргумент, который является корневым каталогом.
Это пример кода, не проверенный, но он должен работать.
use strict;
use warnings;
use autodie;
use File::Copy;
my $rootdir = shift || "/rootdir";
opendir my $dh, $rootdir;
chdir $rootdir;
my @dirlist = grep -d, readdir $dh;
for my $dir (@dirlist) {
next if $dir =~ /^\.\.?$/;
chdir $dir;
for my $org (grep -f, glob "*.txt") { # identify target file
my $new = $org;
$new .= "_foo"; # change file name, edit here!
move $org, $new;
}
chdir "..";
move $dir, $new;
}