Perl文件名更改

时间:2011-03-15 18:41:52

标签: perl unix

我正在研究和扩展其他人编写的Perl脚本。它有一条线:

@pub=`ls $sourceDir | grep '\.htm' | grep -v Default |  head  -550`;
foreach (@pub) {

   my $docName = $_;
   chomp($docName);
   $docName =~ s/\.htm$//g;
    ............}

我知道它首先使用UNIX命令取出所有htm文件,然后摆脱文件扩展名。

现在我需要做一件事,这也很重要。也就是说,我需要通过用下划线替换空格来更改存储的实际文件的文件名。我被困在这里因为我不确定我是否应该遵循他的代码风格,通过使用UNIX实现这一点,或者我应该在Perl中执行此操作?关键是我需要修改磁盘上的真实文件,而不是用来保存文件名的字符串。

感谢。

2 个答案:

答案 0 :(得分:3)

这样的事情应该有帮助(未经测试)

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

my @files = grep { ! /Default/ } glob("$sourceDir/*.htm");
# I didn't implement the "head  -550" part as I don't understand the point.
# But you can easily do it using `splice()` function.

foreach my $file (@files) {
    next unless (-f $file);   # Don't rename directories!
    my $dirname = dirname($file); # file's directory, so we rename only the file itself.
    my $file_name = basename($file); # File name fore renaming.
    my $new_file_name = $file_name;
    $new_file_name =~ s/ /_/g; # replace all spaces with underscores
    rename($file, File::Spec->catfile($dirname, $new_file_name))
        or die $!; # Error handling - what if we couldn't rename?
}

答案 1 :(得分:2)

使用File::Copy将文件移动到新名称会更快,而不是使用这种方法来分解新进程,生成新的shell等等。它需要更多内存并且比执行速度慢它在perl内部。

编辑..你可以摆脱所有的反击b.s.,就像这样

my @files = grep {!/Default/} glob "$sourcedir/*.html";