如何复制除Perl中所有隐藏文件之外的目录?

时间:2010-01-23 16:06:25

标签: perl

我有一堆文件的目录层次结构。一些目录以.开头。 我想在其他地方复制层次结构,省略所有以.

开头的文件和目录

怎么能这样做?

6 个答案:

答案 0 :(得分:3)

我认为你想要的是File::Copy::Recursivercopy_glob()

  

rcopy_glob()

     

此功能可让您指定一个   适合perl的glob()的模式   第一个论点。随后各自   perl的glob()返回的路径获取   rcopy()组卷。

     

返回其项目所在的数组   包含返回的数组引用   每个rcopy()调用的值。

     

它强制行为就好像   $ File :: Copy :: Recursive :: CPRFComp is   真。

答案 1 :(得分:3)

如果您能够在没有Perl的情况下解决此问题,则应该查看rsync。它可以在类Unix系统上,在Windows上通过cygwin获得,也可以作为Windows上的独立工具。它会做你需要的东西以及更多。

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

如果您不是所有文件的所有者,请使用-rOlt代替-a

答案 2 :(得分:0)

Glob默认忽略点文件。

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

答案 3 :(得分:0)

下面的代码以简单的方式完成工作,但不处理符号链接,例如。

#! /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;

答案 4 :(得分:0)

cp -r .??*

几乎完美,因为它错过了以文件开头的文件。然后是一个单一的标志。喜欢 - .d或.e

echo .[!.] .??*

这是更好的

或:

shopt -s dotglob ; cp -a * destination; shopt -u dotglob

答案 5 :(得分:0)

我找到了 File::Copy::Recursive 的 rcopy_glob()。

以下是文档中显示但具有欺骗性的内容。

use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);

它不导入 rcopy_glob() 并且我发现使用它的唯一方法是如下所示:

use File::Copy::Recursive;

File::Copy::Recursive::rcopy_glob("glob/like/path","dest/path");