Как я могу скопировать каталог, кроме всех скрытых файлов в Perl? - PullRequest
4 голосов
/ 23 января 2010

У меня есть иерархия каталогов с кучей файлов. Некоторые из каталогов начинаются с .. Я хочу скопировать иерархию куда-то еще, оставив все файлы и каталоги, которые начинаются с .

Как можно это сделать?

Ответы [ 5 ]

3 голосов
/ 23 января 2010

Я думаю, что вы хотите File :: Copy :: Recursive rcopy_glob():

rcopy_glob ()

Эта функция позволяет вам указать шаблон, подходящий для глобуса Perl () как первый аргумент. Впоследствии каждый путь, возвращаемый глобусом Perl (), получает RCOPY () IED.

Возвращает и массив, элементы которого ссылки на массив, которые содержат возврат значение каждого вызова rcopy ().

Это заставляет поведение, как будто $ File :: Copy :: Recursive :: CPRFComp is правда.

3 голосов
/ 23 января 2010

Если вы можете решить эту проблему без Perl, вам следует проверить rsync. Он доступен в Unix-подобных системах, в Windows через Cygwin и, возможно, в качестве отдельного инструмента в Windows. Он будет делать то, что вам нужно, и многое другое.

rsync -a -v --exclude='.*' foo/ bar/

Если вы не являетесь владельцем всех файлов, используйте -rOlt вместо -a.

0 голосов
/ 04 апреля 2011
cp -r .??*

почти идеально, потому что он пропускает файлы, начинающиеся с. и сопровождается одним знаком. как - .d или .e

echo .[!.] .??*

это даже лучше

или

shopt -s dotglob ; cp -a * destination; shopt -u dotglob
0 голосов
/ 24 января 2010

Приведенный ниже код выполняет работу простым способом, но не обрабатывает символические ссылки, например.

#! /usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Copy;
use File::Find;
use File::Spec::Functions qw/ abs2rel catfile file_name_is_absolute rel2abs /;

die "Usage: $0 src dst\n" unless @ARGV == 2;
my($src,$dst) = @ARGV;

$dst = rel2abs $dst unless file_name_is_absolute $dst;
$dst = catfile $dst, basename $src if -d $dst;

sub copy_nodots {
  if (/^\.\z|^[^.]/) {
    my $image = catfile $dst, abs2rel($File::Find::name, $src);

    if (-d $_) {
      mkdir $image
        or die "$0: mkdir $image: $!";
    }
    else {
      copy $_ => $image
        or die "$0: copy $File::Find::name => $image: $!\n";
    }
  }
}

find \&copy_nodots => $src;
0 голосов
/ 23 января 2010

Glob по умолчанию игнорирует точечные файлы.

perl -lwe'rename($_, "foo/$_") or warn "failure renaming $_: $!" for glob("*")'

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