переименуйте набор каталогов и файлов в каждом из этих каталогов - PullRequest
0 голосов
/ 26 декабря 2011

Проблема, для которой должен быть разработан perl-код, заключается в следующем:

Существует корневой каталог, содержащий несколько каталогов. В каждом подкаталоге содержится текстовый файл.

Нам нужно войти в каждый каталог корневого каталога и сначала переименовать файл в этом каталоге. Затем нам нужно будет вернуться назад или на один каталог и заменить имя каталога тем же именем, что и текстовый файл, который он содержит.

Шаги:

  1. открыть каждый каталог
  2. переименовать текстовый файл в открытой директории
  3. перейти на один уровень вверх и переименовать сам каталог с тем же именем, что и текстовый файл, который он содержит
  4. перейти к следующему каталогу в корневом каталоге

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

Вы можете использовать модуль File :: Find , он рекурсивно пересекает дерево каталогов. Для этой цели можно использовать функцию finddepth() в модуле, она выполняет порядок. обход от нижней части дерева каталогов вверх.

use File::Find;
my $DirName = 'path_of_dir' ;

sub rename_subdir
{
    #The path of the file/dir being visited.
    my $orignm = $File::Find::name;
    my $newnm = $orignm . '_rename';
    print "Renaming $orignm to $newnm\n";
    rename ($orignm, $newnm);
}

#For each file and sub directory in $Dirname, 'finddepth' calls
#the 'rename_subdir' subroutine recursively.
finddepth (\&rename_subdir, $DirName);
0 голосов
/ 26 декабря 2011

Вы не упомянули, как вы храните имена файлов, которые будут использоваться для переименования, поэтому я предполагаю, что это общий тип изменений, например "file_x" -> "file_x_foo". Вы должны определить это сами.

Этот сценарий попытается переименовать все файлы в каталоге, предполагая, что единственный обычный файл в каталоге - это целевой файл. Если у вас есть больше файлов в каталоге, вам нужно будет предоставить средство идентификации этого файла.

Скрипт принимает необязательный аргумент, который является корневым каталогом.

Это пример кода, не проверенный, но он должен работать.

use strict;
use warnings;
use autodie;
use File::Copy;

my $rootdir = shift || "/rootdir";
opendir my $dh, $rootdir;
chdir $rootdir;
my @dirlist = grep -d, readdir $dh;   
for my $dir (@dirlist) {
    next if $dir =~ /^\.\.?$/;
    chdir $dir;
    for my $org (grep -f, glob "*.txt") { # identify target file
        my $new = $org;
        $new .= "_foo";   # change file name, edit here!
        move $org, $new;
    }
    chdir "..";
    move $dir, $new;
}
0 голосов
/ 26 декабря 2011

Привет, я пытаюсь сделать обзор вашей идеи

#!/usr/bin/perl
use strict;
use File::Find;
use Data::Dumper;
use File::Basename;
my $path = 'your root directory';
my @instance_list;
find (sub { my $str = $_;
        if($str =~ m/.txt$/g) {                             
            push @instance_list, $File::Find::name if (-e $File::Find::name); 
        } 
      }, $path);
print Dumper(@instance_list);




for my $instance (@instance_list) {
  my $newname = 'newEntry';
  my $filename = basename( $instance );
  #rename the file 1st,
  my $newFileName = dirname( $instance ) .'/'. $filename.$newname.'.txt'
;

  rename($instance, $newFileName) or die $!;
  #rename the directory
  my $newDirName = dirname(dirname( $instance ) ).'/'. $newname;

   rename(dirname($instance), $newDirName) or die $!;

}
...