【发布时间】:2014-07-10 15:16:02
【问题描述】:
注意:相关问题已通过使用已弃用的模块解决,并且在整个操作系统中不一致。当前问题的答案使用较新的模块,因此在此处发布。
我有一个模块,它反过来使用File::NCopy CPAN 模块将文件从 .
问题是 - 我只需要递归地将特定文件类型的文件复制到目的地。有没有办法通过扩展过滤源?
作为替代方案 - 有没有办法复制除隐藏文件之外的所有文件?我的主要问题是 .git 文件夹也被复制 - 这是不希望的。
平台:MacOS
探索的替代方案:
1) File::Copy::Recursive 模块:- 似乎只提供文件或目录的递归副本。似乎对隐藏文件或排除过滤器没有帮助
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 :- 似乎合理 - 将使用它运行一个快速实现。
已实施的解决方案:
我使用了递归模块和 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: $!";
}
});
没有相对路径 - 目标文件夹结构似乎与源文件夹结构不同。
【问题讨论】:
-
次要注意:
File::NCopy报告它已被弃用并建议改用File::Copy::Recursive。 -
什么操作系统?
-
如果您想排除点文件 AFAIK,您可能需要自行开发解决方案。
-
该链接问题显示了如何使用 File::Copy(来自 OP 中已废弃模块的指针包装)递归复制符合条件的文件。
-
metacpan.org/pod/Path::Class::Dir 具有遍历和递归函数,可以使用闭包来运行代码。这将很容易用于对符合特定条件的文件执行递归复制。