Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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将目录名与文本文件匹配来重命名目录名 sample.txt: PROJ:DEMO PROJ:PROJECT_SPACE PROJ:project:prj1 BLOCK:block:blk1 CHECKLIST:design_check:checklist1 原始目录结构 ├── prj1 │   ├── blk1 │   │   └── checklist1 │   │   ├── rev │   │   │   └─

我有下面的文本文件,其中有目录名。现在我应该通过使用perl将目录名与文本文件匹配来重命名目录名

sample.txt:

PROJ:DEMO
PROJ:PROJECT_SPACE
PROJ:project:prj1
BLOCK:block:blk1
CHECKLIST:design_check:checklist1
原始目录结构

├── prj1
│   ├── blk1
│   │   └── checklist1
│   │       ├── rev
│   │       │   └── rev.config
│   │       └── temp_rest
│   │           └── rev.config
│   └── block_status.config
预期的输出目录结构:

├── project
│   ├── block
│   │   └── design_check
│   │       ├── rev
│   │       │   └── rev.config
│   │       └── temp_rest
│   │           └── rev.config
│   └── block_status.config
我的代码:

#!/usr/local/bin/perl
use strict;
@filename;
$i = 0;
$total;
open(INFILE,"sample.txt");
while($filename[$i] = <INFILE>){
  chop($filename[$i]);
  $filename[$i] =~ s/\*//g;
  $i++;
  $total++;
}
#/usr/local/bin/perl
严格使用;
@文件名;
$i=0;
总数$$;
打开(infle,“sample.txt”);
而($filename[$i]=){
印章($filename[$i]);
$filename[$i]=~s/\*//g;
$i++;
$total++;
}
代码说明:

我尝试读取文本文件,并使用替换和增量运算符来包含这些文件


我想到了要添加更多的内容以形成预期的目录结构。

您可以尝试类似的方法,但在尝试此代码之前,请小心并进行备份:

#! /usr/bin/env perl
use feature qw(say);
use strict;
use warnings;

use Cwd qw(getcwd);
use File::Copy ();

my $dir_map = read_map( 'sample.txt' );
my $top_dir = '.';

rename_dirs( $top_dir, $dir_map );

 sub rename_dirs {
    my ( $top_dir, $dir_map ) = @_;

    opendir (my $dh, $top_dir) or die "Can't open $top_dir: $!";
    my $save_dir = getcwd();
    chdir $top_dir;
    while (my $dir = readdir $dh) {
        next if ($dir eq '.') or ($dir eq '..'); 
        if ( exists $dir_map->{$dir} ) {
            my $new_name = $dir_map->{$dir};
            #say "$save_dir: rename $dir $new_name";
            File::Copy::move( $dir, $new_name )
                or die "Could not rename '$dir' as '$new_name': $!";
            $dir = $new_name;
        }
        rename_dirs( $dir, $dir_map ) if -d $dir;
    }
    chdir $save_dir;
}

sub read_map {
    my ( $fn ) = @_;

    my %dir_map;

    open( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    while( my $line = <$fh> ) {
        chomp $line;
        my @fields = split /:/, $line;
        if ( @fields == 3 ) {
            $dir_map{$fields[2]} = $fields[1];
        }
    }
    close $fh;
    return \%dir_map;
}
#/usr/bin/env perl
使用特征qw(例如);
严格使用;
使用警告;
使用Cwd-qw(getcwd);
使用File::Copy();
my$dir_map=read_map('sample.txt');
我的$top_dir=';
重命名目录($top\u dir,$dir\u map);
子目录{
我的($top\u dir,$dir\u map)=@;
opendir(my$dh,$top_dir)或die“无法打开$top_dir:$!”;
我的$save_dir=getcwd();
chdir$top_dir;
while(my$dir=readdir$dh){
下一个if($dir-eq'')或($dir-eq'..);
if(存在$dir_映射->{$dir}){
我的$new_name=$dir_map->{$dir};
#说“$save_dir:rename$dir$new_name”;
文件::复制::移动($dir,$new_名称)
or die“无法将“$dir”重命名为“$new_name”:$!”;
$dir=$new_name;
}
重命名_dirs($dir,$dir_map)如果-d$dir;
}
chdir$save_dir;
}
子读图{
我的($fn)=@;
我的%dir\u地图;

打开(my$fh),您可以尝试类似的操作,但在尝试此代码之前,请小心并进行备份:

#! /usr/bin/env perl
use feature qw(say);
use strict;
use warnings;

use Cwd qw(getcwd);
use File::Copy ();

my $dir_map = read_map( 'sample.txt' );
my $top_dir = '.';

rename_dirs( $top_dir, $dir_map );

 sub rename_dirs {
    my ( $top_dir, $dir_map ) = @_;

    opendir (my $dh, $top_dir) or die "Can't open $top_dir: $!";
    my $save_dir = getcwd();
    chdir $top_dir;
    while (my $dir = readdir $dh) {
        next if ($dir eq '.') or ($dir eq '..'); 
        if ( exists $dir_map->{$dir} ) {
            my $new_name = $dir_map->{$dir};
            #say "$save_dir: rename $dir $new_name";
            File::Copy::move( $dir, $new_name )
                or die "Could not rename '$dir' as '$new_name': $!";
            $dir = $new_name;
        }
        rename_dirs( $dir, $dir_map ) if -d $dir;
    }
    chdir $save_dir;
}

sub read_map {
    my ( $fn ) = @_;

    my %dir_map;

    open( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    while( my $line = <$fh> ) {
        chomp $line;
        my @fields = split /:/, $line;
        if ( @fields == 3 ) {
            $dir_map{$fields[2]} = $fields[1];
        }
    }
    close $fh;
    return \%dir_map;
}
!/usr/bin/env perl
使用特征qw(例如);
严格使用;
使用警告;
使用Cwd-qw(getcwd);
使用File::Copy();
my$dir_map=read_map('sample.txt');
我的$top_dir=';
重命名目录($top\u dir,$dir\u map);
子目录{
我的($top\u dir,$dir\u map)=@;
opendir(my$dh,$top_dir)或die“无法打开$top_dir:$!”;
我的$save_dir=getcwd();
chdir$top_dir;
while(my$dir=readdir$dh){
下一个if($dir-eq'')或($dir-eq'..);
if(存在$dir_映射->{$dir}){
我的$new_name=$dir_map->{$dir};
#说“$save_dir:rename$dir$new_name”;
文件::复制::移动($dir,$new_名称)
or die“无法将“$dir”重命名为“$new_name”:$!”;
$dir=$new_name;
}
重命名_dirs($dir,$dir_map)如果-d$dir;
}
chdir$save_dir;
}
子读图{
我的($fn)=@;
我的%dir\u地图;

打开(我的$fh,'unix用户,对吗?如果是这样,您可以使用
find-typed
rename
找到所有目录,如果目录名在您的列表中,请参见也很抱歉,但我没有时间放进去,但一般来说:
@dirs=`find.-typed`
,打开您的文件并获取从,到您需要的
if(/.\:(.*):(.*)/){…
,替换第一次出现的$2到$1和
map
剩下的@dirs从$2到$1你的代码没有编译。请不要发布我们无法运行的代码。你是否只是添加了
使用strict
以避免在这里发布代码时被指责?即使没有
使用strict
你也会得到两个
无用的v无效上下文中的变量
警告。哪里是
prj1
?它是根目录吗?unix用户,对吗?如果是这样,您可以使用
find-type d
rename
找到所有目录,如果目录名在您的列表中,请参见,也很抱歉,但我没有时间放进去,但一般来说:
@dirs=`find-type d`
,如果(/.*\:(.*):(.*)/,请打开您的文件并获取所需的从,到
{…
,替换第一次出现的$2到$1和
map
剩下的@dirs从$2到$1你的代码没有编译。请不要发布我们无法运行的代码。你是否只是添加了
使用strict
以避免在这里发布代码时被指责?即使没有
使用strict
你也会得到两个
无用的v无效上下文中的变量
警告。哪里是
prj1
?它是根目录吗?