Следующий однострочный скрипт предназначен для переименования файлов, например. от Foo_Bar_Baz.txt
до Baz_Bar_Foo.txt
:
(rename
— это утилита rename(1)
из File::Rename
.)
rename -n 's/(\w+)_(\w+)_(\w+)/join "_", reverse @{^CAPTURE}/xe' ./*.txt
Это работает, но в настоящее время количество групп, разделенных подчеркиванием, жестко запрограммировано. То есть скрипт отлично работает, например. Foo_Bar_Baz
, но он неправильно обрабатывает Foo_Bar
или Aaa_Bbb_Ccc_Ddd
.
Как можно настроить его таким образом, чтобы он обрабатывал произвольное количество групп, разделенных подчеркиванием?
Используйте разделение:
rename -n 's{(.*)(?=\.txt$)}{ join "_", reverse split /_/, $1 }e' *.txt
Я не знаю Perl, поэтому использовал CodeConvert для перевода Python в Perl.
Идея состоит в том, чтобы разделить путь .
на префикс и суффикс. Затем разделите префикс вдоль _
на список. Переверните список и соедините его с помощью _
. Наконец объединить с суффиксом
use strict;
use warnings;
my $s1 = "Aaa_Bbb_Ccc_Ddd.txt";
my $s2 = "Baz_Bar_Foo.txt";
sub reverse_prefix {
my ($path) = @_;
my ($prefix, $suffix) = split(/\./, $path);
my @pf_elements = split(/_/, $prefix);
my $pf_elements_rev = join("_", reverse @pf_elements);
return "$pf_elements_rev.$suffix";
}
print reverse_prefix($s1), " ", reverse_prefix($s2);
Смотрите на onecompiler
хотя этот код явно не содержит ошибок, codeconvert использует генеративный искусственный интеллект, и его использование для генерации ответов запрещено - stackoverflow.com/help/gen-ai-policy
не знаю Perl, но почему бы не создать список, разделив его на
_
, а затем соединив зарезервированный список на_
?