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;

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

4

1 回答 1

1

您可以排除.如下..

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

一些一般性说明:

  • 始终对您想要做什么有一个非常明确的规范。这也有助于每个试图帮助你的人。
  • 目前尚不清楚这里出了什么问题。也许您的正则表达式根本不匹配您希望它匹配的目录?问题是什么?
  • 尝试将非常特定的部分(例如您要开始处理的目录的名称)制作成参数。显然,一些细节更难成为参数,比如重命名什么以及如何重命名。
  • 使用opendir, readdir,renameFile::Spec是很好的开始。不过,有一个更简单的方法:看一下Path::Classmodule,特别是它的两个子类。它们提供了一个精心设计的抽象层File::Spec(甚至更多),它基本上是文件系统操作的一站式服务。
于 2012-05-20T08:41:13.043 回答