2014-05-21 32 views
3

注意:相关问题通过使用不推荐使用的模块解决,并且在OS之间不一致。当前问题的答案使用较新的模块,因此将在此处发布。Perl以递归方式复制特定格式的文件

我有一个模块,反过来使用File::NCopy CPAN模块从文件递归复制到。

问题是 - 我需要递归复制特定文件类型的文件到目的地。有什么方法可以通过扩展来过滤源代码?

作为替代 - 有没有办法复制除隐藏文件以外的所有文件?我的主要问题是.git文件夹也被复制 - 这是不希望的。

平台:MacOS的

替代探索:

1)文件::复制::递归模块: - 似乎提供文件或目录的唯一递归复制。似乎无法帮助隐藏文件或排除过滤器

2)使用rsync -avz --exclude =“。*”: - 无法将其与递归复制功能结合使用。

3)与How can I copy a directory recursively and filter filenames in Perl?类似的自主开发的解决方案: - 可能是最后的手段 - 但似乎不移植,除非在不同平台上进行了调整和测试。 除非模块已经存在,否则会回落到此。

4)https://metacpan.org/pod/Path::Class::Dir: - 似乎似乎 - 将运行一个快速实施使用此。

实施的解决方案:

我用递归模块和路径::类::迪尔

dir($sourceDir)->recurse(callback => sub { 
    my $file = shift; 

    return if($file eq '.' || $file eq '..'); 

    return if -d $file; 

    if (<custom filter>) 
    { 
     my $path = file($file)->relative($sourceDir); 
     fcopy("$sourceDir/$path", "$destinationDir/$path") or die "Could not perform fcopy: $!"; 
    } 
}); 

没有相对路径 - 目标文件夹结构似乎并不相同作为源文件夹结构。

+2

小记:['文件:: NCopy'(https://metacpan.org/pod/File::NCopy)报告说,它已被弃用,建议使用['文件::复制:: Recursive']( https://metacpan.org/pod/File::Copy::Recursive)。 – Miller

+0

什么操作系统? – ooga

+0

如果您想排除点文件AFAIK,则可能必须制作本地解决方案。 – squiguy

回答

1

我认为最简单的解决方案是使用File::Copy::Recursive完全复制目录结构,然后返回File::Find::Rule以确定您要过滤并删除它们的所有目录。

鉴于.git文件夹不一定持有如此多的数据,我想表现的命中从复制的文件超过你需要的可能是非常小的。下面将足以实现你的愿望:

use strict; 
use warnings; 

use File::Copy::Recursive qw(dircopy pathrmdir); 
use File::Find::Rule; 

my $src = '...src...'; 
my $dest = '...dest...'; 

dircopy($src, $dest) or die "Can't dircopy: $!"; 

my @git = File::Find::Rule->directory() 
          ->name('.git') 
          ->in($dest); 

pathrmdir($_) or die "Can't remove $_: $!" for (@git); 

另外,如果你想推出自己的,你可以看看File::Find::Rule #Further Examples,其中包括关于如何“忽略CVS目录”的一个例子。

相关问题