我有以下文本文件,其中包含目录名。现在我应该通过使用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++;
}
代码说明:
我尝试读取文本文件并使用替换并使用increment运算符来包含文件。
我已经想要添加更多东西来制作预期的目录结构。
答案 0 :(得分:2)
您可以尝试这样的操作,但在尝试使用此代码之前请务必小心并进行备份:
#! /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;
}