Perl Move Files - PullRequest
       1

Perl Move Files

0 голосов
/ 24 июня 2010

Я использую этот код для перемещения файлов из каталогов, но мне нужно сделать 2 изменения, и я был бы признателен за помощь.

Я хочу "return, если только" найденный каталог / ^ _ temp \ z / s не содержит cue && toc && accurip && flac файлы. Если одно из этих расширений отсутствует, перейдите в следующий каталог.

И если это условие верно - переместить файлы из DIR, '.' каталог в $ dir_dump, но со скопированной родительской папкой, и если первая родительская папка содержит «Disc \ d», чтобы скопировать вторую родительскую папку и переместить $ dir_dump \ $ parent_folder \ $ disc.

find(\&temp, $dir_target); 
sub temp {
my $dir_dump = "E:/_dump/";
my ($dev,$ino,$mode,$nlink,$uid,$gid);
return unless ((($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -d _ && /^\_temp\z/s);
    chdir($File::Find::dir) or die "could not cd to $File::Find::dir: $!";
    # mv files from cur dir to $dir_dump
    opendir DIR, '.' or die "could not open dir: $!";
    my @files = grep m{\.(?:accurip|cue|flac|log|toc|wv)\z}, readdir DIR;
    closedir DIR;
foreach my $file (@files) {
    mv $file, $dir_dump or die "could not mv $file to $dir_dump: $!";
}
# mv files from temp to cur dir
    opendir DIR, '_temp' or die "could not open temp dir: $!";
@files = grep m{\.(?:accurip|cue|flac|toc)\z}, readdir DIR;
    closedir DIR;
foreach my $file (@files) {
    mv "_temp/$file", '.' or die "could not mv $file from _temp: $!";
}
finddepth(sub{rmdir},'.');
}

1 Ответ

1 голос
/ 24 июня 2010

Чтобы проверить, содержит ли каталог файлы со всеми 4 расширениями, вы можете сделать это:

my @dir_files = readdir DIR; # after you did opendir
my %extensions = map { (/\.([^.]+)$/)=> 1 } @dir_files;
foreach my $required_ext (qw(accurip cue flac toc)) {
    return unless $extensions{$required_ext};
}

Должен признать, я не совсем понимаю ваше второе требование, извините. Может быть, вы могли бы привести примеры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...