perl 重命名 1.14-1
Arch Linux:linux 6.2.12.arch1-1
我有一个包含多个子目录的目录/文件夹,所有子目录均按以下模式之一命名
现有模式现状
something-AAA-2023-01-BBB (the most common pattern)
something-2023-01-AAA.BBB (the 2nd or 3rd most common pattern)
2023-01-AAA-BBB-CCC.DDD (the 2nd or 3rd most common pattern)
something-AAA-2023-01-BBB-CCC.DDD
1111-AAA-2023-01-BBB.CCC
1111-2023-01-AAA.BBB
关于这些模式:
- “something”始终是一个字符串,“1111”是一个数字。
- 其中一部分是日期,格式为 YYYY-MM,为了清楚起见,用“2023-01”表示。
- AAA、BBB 等 3 个大写字母的部分有时是在整个文件夹的上下文中有意义的普通单词,有时是字母和数字的混乱组合,在整个文件夹的上下文中也有意义。所有这些 AAA、BBB 等都是在文件夹上下文中有意义的表达式。
- 随着时间的推移,我在文件夹名称中添加了额外的信息,这就是为什么有 CCC 和 DDD 的原因。
预期产出
在它们发生之前,我希望将元素(“1111”、AAA、BBB 等)像
1111.AAA.2023-01.something.BBB.CCC.DDD
我想首先查找/捕获第一个和第二个连字符(如果存在)之间的内容。
到目前为止我在
perl-rename -n 's/^(.+)\-(.+)\-(\d{4}\-\d{2})\-(.+)/\3\.\1\./' *
但这并不是真正的“聪明”。有没有办法检查日期是否在第一个和第二个连字符之间或第二个和第三个连字符之间、日期之前(\d{4}\-\d{2})
还是之后?或者更确切地说,我是否必须通过定义日期前后内容的括号数量来查找所有不同的情况? (对不起我的英语)
或者如何检查该日期字符串之前的连字符是否是第二个连字符?查找某个字符的第 n 次出现肯定会对将来有所帮助。
答案1
您可以尝试类似的方法,使用autosplit
模式 with-F
根据-
分隔符拆分列,这样可以方便操作。
要发现自动生成的数组中带有日期字符串的第 n 个元素的位置,@F
请使用以下代码:
$ ls
1111-AAA-2023-01-BBB.CCC
$ perl -F'-' -nE '
foreach my $i (keys @F) { say $i if "$F[$i]-$F[$i+1]" =~ m/\d{4}-\d{2}/; }
' < <(printf '%s\n' *)
2
1111-AAA-2023-01-BBB.CCC
# ^^^^ ^^^ ^^^^ ^^ ^^^^^^^
# 0 1 2 3 4 keys of @F array
2
是包含年份的数组元素的键。下一个元素是月份。
现在,基于此,如果您给我/我们需要重命名的输入文件和预期的输出,那么使用 Perl 命令甚至在rename
.