Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用perl重命名带有链接目录名的文件?_Perl - Fatal编程技术网

如何使用perl重命名带有链接目录名的文件?

如何使用perl重命名带有链接目录名的文件?,perl,Perl,我喜欢使用perl用目录名重命名我的文件。我包括了我的目录结构,如下所示: |-- Basket | |-- ICC | | |-- rest10-rest10-rest10-test.txt | | `-- rest1 | | `-- rest1-rest1-rest1-rest.txt | |-- bl2-bl2-bl2-b1.txt 预期: |-- Basket | |-- ICC

我喜欢使用perl用目录名重命名我的文件。我包括了我的目录结构,如下所示:

    |-- Basket
    |   |-- ICC
    |   |   |-- rest10-rest10-rest10-test.txt
    |   |   `-- rest1
    |   |       `-- rest1-rest1-rest1-rest.txt
    |   |-- bl2-bl2-bl2-b1.txt
预期:

    |-- Basket
    |   |-- ICC
    |   |   |-- ICC_rest10.txt
    |   |   `-- rest1
    |   |       `-- ICC_rest1.txt
    |   |-- Basket_bl2.txt
我的代码:(我尝试获取所有.txt文件)

但要注意文件名冲突:

rest1-rest1-rest.txt
rest1-rest1-rest1-rest.txt

在同一方向…

你的问题是什么?您不会对
$o_name
进行任何更改,因此您的
重命名将不会更改文件的名称。你也只在一个目录中查找,这样你的子目录就不会被处理。重复:我想他们在那里通过与某个文件匹配来更改目录名。在这里,我想用相应目录中的目录名来更改文本文件。那么它将如何重复question@user2141046My问题是用受尊重的目录名重命名.txt文件。@Borodini有几个问题1)为什么使用($$)2)如果我执行此代码,它将命名目录如果我再次执行相同的代码,它将两次重命名文件名为什么会这样。。例如(rest1-rest1-rest\u rest1-rest1-rest.txt)@v.sheldeshov($$)-只是为了定义runDir需要2个变量。以避免以后使用时出错。“res”问题:若文件名是从前缀开始的,那个么添加额外的检查并不太难。将}elsif((-f$dir./'.$file)&&($file=~/\.txt$/){………..替换为}elsif(-f$dir./'.$file)&($file=~/\.txt$/)&($file!~/^$prefix/){
#!/usr/bin/perl
use strict;
use warnings;
sub runDir($$);
sub runDir($$) {
    my $prefix = shift @_;
    my $dir = shift @_;
    opendir(DIR, $dir) or die $!;
    my @entries = readdir(DIR);
    close(DIR);
    foreach my $file (@entries) {
        next if ($file =~ /^\.+$/);
        if ( -d $dir . '/' . $file) {
            runDir($prefix . $file . '_', $dir . '/' . $file);
        } elsif ( ( -f $dir . '/' . $file ) && ( $file =~ /\.txt$/ ) ) {
            my $suffix = $file;
            $suffix =~ s/^(\S+)-.+\.txt$/$1.txt/;
            print "rename $dir . '/' . $file, $dir . '/' . $prefix . $suffix . \n";
        }
    }
}
runDir('output_', '/home/user1/output');
rest1-rest1-rest.txt
rest1-rest1-rest1-rest.txt