无法在Perl中的子目录中打开文件

时间:2017-09-06 20:34:45

标签: perl file subdirectory

我真的很难过。我是Perl的新手,我完全不想尝试遍历所有子目录,执行操作。它在根目录(我的脚本所在的位置)中工作正常,但只要它到达子目录,它就会轰炸。我试过在“或”或q {}中包围文件名无效。我在StackOverflow上搜索了这个问题,人们说它应该正常工作,打开处理子目录并接受正斜杠。 一旦它潜入目录并尝试打开'./Horse/Models.meta',它就会在第一次打开(读取文件)时失败。这是在处理了与我的脚本相同级别的20个文件之后。有什么想法吗?

use 5.010;
use strict;
use warnings;
use File::Find;

find(sub {
if (-f and /\.meta$/) {
    print "--> " . $File::Find::name . "\n";
    open my $in,  '<',  $File::Find::name    or die "Can't read old file: $!";
    open my $out, '>', "$File::Find::name.new" or die "Can't write new file: $!";

    while( <$in> )
    {
            if(index($_,"  assetBundleName:")!=-1) {
                    print $out "  assetBundleName: mobs\n";
            } else {
                    print $out $_;
            }
    }
    close $out;
    print("mv -f \"" . $File::Find::name . ".new\" \"" . $File::Find::name . "\"\n");

    system("mv -f \"" . $File::Find::name . ".new\" \"" . $File::Find::name . "\"");

  }
}, '.');

2 个答案:

答案 0 :(得分:1)

只需使用

rename "$File::Find::name.new", $File::Find::name or die $!;

请参阅rename

如果要使用相对路径(即$ File :: Find :: name)而不是文件名(即$ _),则需要指定

find({ wanted   => sub { ... },
       no_chdir => 1,
}, '.');

答案 1 :(得分:1)

$File::Find::name是文件相对于原始CWD的完整路径名,但File::Find会不断更改CWD,除非您另有说明。告诉File :: Find不要使用no_chdir => 1更改CWD,或使用$_而不是$File::Find::name。我推荐前者。

在不相关的说明中,您应该使用以下命令重命名文件而不是炮轰。

rename($old_name, $new_name)
   or die("Can't rename \"$old_name\" \"$new_name\": $!\n");

如果你需要跨文件系统边界重命名文件,你可以使用File :: Copy的move,但如果做得不好,那么炮轰就不那么糟糕了:

system("mv", "-f", "--", $old_name, $new_name);
die("Error executing mv: $!\n") if $? == -1;
die("mv killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
die("mv returned error ".( $? >> 8 )."\n") if $? >> 8;