如何通过使用perl匹配文本文件来重命名目录结构?
我有下面的文本文件,其中有目录名。现在我应该通过使用perl将目录名与文本文件匹配来重命名目录名 sample.txt:如何通过使用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 │ │ │ └─
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
?它是根目录吗?