如何通过使用perl匹配文本文件来重命名目录结构?

时间:2017-03-01 09:24:44

标签: perl

我有以下文本文件,其中包含目录名。现在我应该通过使用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运算符来包含文件。

我已经想要添加更多东西来制作预期的目录结构。

1 个答案:

答案 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;
}