2012-05-20 48 views
1
#!/usr/bin/perl -w 

use strict; 
use File::Copy; 
use File::Spec; 

my($chptr, $base_path, $new, $dir); 

$dir = "Full Metal Alchemist"; #Some dir 

opendir(FMA, $dir) or die "Can't open FMA dir"; 
while($chptr = readdir FMA){ 
$base_path = File::Spec->rel2abs($dir).'/'; #find absolute path of $fir 
if($chptr =~ m(Chapter\w*\d*)){ #some regex to avoid the .. and . dirs 
    $new = join(" 0", split(/\W/, $chptr)); #modify said sub directory 
    rename "$base_path$chptr", "$base_path$new" ? print "Renames $base_path$chptr to 
    $base_path$new\n" : die "rename failed $!"; 
    } 
} 
closedir FMA; 

最初,我的脚本只使用相对路径来执行move操作,但由于某些原因,这会使子目录不受影响。我的下一步是去绝对路径,但无济于事。我只是在学习Perl,所以我觉得我犯了一个简单的错误。我哪里错了? TIA在Perl中重命名子目录

+0

你想避免什么问题? – aleroot

+0

目前,我从重命名声明中得到误判。我想重命名子目录。我唯一避免的是试图重命名核心。和..链接 –

回答

1

您可以排除...如下:

if ($child ne '.' and $child ne '..') { ... } 

一些一般性意见:

  • 始终有你想要做什么非常明确的规范。这也有助于所有人试图帮助你。
  • 不清楚这里出了什么问题。也许你的正则表达式与你想要匹配的目录不匹配?问题是什么?
  • 尝试将非常特定的部分(如要开始处理的目录的名称)制作为参数。显然,一些细节很难做成参数,比如什么以及如何重命名。
  • 使用opendir,readdir,renameFile::Spec适合启动。但有一个更简单的方法:看看Path::Class module,特别是它的两个子类。它们通过File::Spec(以及更多)提供精心设计的抽象层,它基本上是文件系统操作的一站式服务。
+0

谢谢,我的正则表达式工作正常,它只是重命名操作不起作用。我会研究使用Path :: Class。我只是困惑为什么重命名实际上不重命名目录。 –

+0

'File :: Spec-> no_upwards()'更好,你知道;) – gaussblurinc