【发布时间】:2013-07-18 19:53:16
【问题描述】:
我有一个包含 96 个要重命名的文件的文件夹。问题是每个文件名都需要一个唯一的更改......不像在每个名称的前面添加一个零或更改扩展名。进行搜索和替换是不切实际的。 以下是我要更改的名称示例:
newSEACODI-sww2320H-sww24_07A_CP.9_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07B_CP.10_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07C_CP.11_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07D_CP.12_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07E_R.1_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07F_R.3_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07G_R.4_sww2320H_sww2403F.fsa
newSEACODI-sww2320H-sww24_07H_R.5_sww2320H_sww2403F.fsa
我想用perl把上面的名字分别改成下面的名字:
SEACODI_07A_A.2_sww2320H_2403F.fsa
SEACODI_07B_A.4_sww2320H_2403F.fsa
SEACODI_07C_H.1_sww2320H_2403F.fsa
SEACODI_07D_H.3_sww2320H_2403F.fsa
SEACODI_07E_H.6_sww2320H_2403F.fsa
SEACODI_07F_H.7_sww2320H_2403F.fsa
SEACODI_07G_Rb.4_sww2320H_2403F.fsa
SEACODI_07H_Rb.9_sww2320H_2403F.fsa
这样的事情能做到吗?我有一个模糊的想法,我可能会制作一个包含新名称列表的文本文件,并将该列表称为@newnames。我会从当前文件名中创建另一个数组,并将其命名为@oldnames。然后我会做某种for 循环,其中@oldnames 中的每个元素$i 都被@newnames 中的相应$i 替换。
不过,我不知道如何从我当前的文件名中创建一个数组,因此我不确定这个模糊的想法是否正确。我将带有混乱名称的文件保存在一个名为“oldnames”的目录中。下面是我尝试从该目录中的文件名中创建一个数组:
#!/usr/bin/perl -w
use strict; use warnings;
my $dir = 'oldnames';
opendir ('oldnames', $dir) or die "cannot open dir $dir: $!";
my @file = readdir 'oldnames';
closedir 'oldnames';
print "@file\n";
上面似乎没有做任何事情。我迷路了。帮忙?
【问题讨论】:
-
将问题拆分为 3 个部分: (1) 解析现有文件名以提取组件; (2) 设计一种转换,将旧文件名转换为所需的新格式,并用转换填充映射; (3) 编写代码进行重命名。如果您无法提出算法转换,那么您唯一的选择是提供新旧文件名的参数文件,您可以手动创建。
-
readdir的使用方法请看the manual
-
说到策略,我建议让你的程序输出一个每个文件一行的脚本,如
mv oldname newname,然后你可以在它看起来正确的时候运行它。 -
Bill:我不想为每个文件都写一个
mv,因为总共大约有一百个。 -
Jim:不幸的是,没有我可以使用的算法。我有一个新旧文件名并排的电子表格。这就是参数文件的意思吗?另外:您能解释一下“使用转化填充地图”是什么意思吗?
标签: arrays perl rename file-rename