Perl递归地复制特定格式的文件
注意:相关问题通过使用不推荐使用的模块解决,并且在整个操作系统中不一致。当前问题的答案使用了较新的模块,因此发布在这里 我有一个模块,它反过来使用CPAN模块递归地将文件从复制到 问题是-我只需要递归地将特定文件类型的文件复制到目标。有没有办法通过扩展来过滤源 作为替代方案-是否有办法复制除隐藏文件以外的所有文件?我的主要问题是.git文件夹也会被复制,这是不需要的 平台:MacOS 探讨的备选方案: 1) 文件::副本::递归模块:-似乎只提供文件或目录的递归副本。似乎对隐藏文件或排除筛选器都没有帮助 2) 使用rsync-avz--exclude=“.*”:-无法将其与递归复制功能结合使用 3) 类似于的国产解决方案:-可能是最后的选择-但除非在不同平台上进行调整和测试,否则似乎无法移植将退回到此状态,除非模块已经存在。 4) :-似乎有道理-将使用此功能运行快速实现 实施的解决方案: 我使用了递归模块和Path::Class::DirPerl递归地复制特定格式的文件,perl,recursion,file-io,Perl,Recursion,File Io,注意:相关问题通过使用不推荐使用的模块解决,并且在整个操作系统中不一致。当前问题的答案使用了较新的模块,因此发布在这里 我有一个模块,它反过来使用CPAN模块递归地将文件从复制到 问题是-我只需要递归地将特定文件类型的文件复制到目标。有没有办法通过扩展来过滤源 作为替代方案-是否有办法复制除隐藏文件以外的所有文件?我的主要问题是.git文件夹也会被复制,这是不需要的 平台:MacOS 探讨的备选方案: 1) 文件::副本::递归模块:-似乎只提供文件或目录的递归副本。似乎对隐藏文件或排除筛选器都
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: $!";
}
});
dir($sourceDir)->递归(回调=>sub{
我的$file=shift;
返回if($file eq'.|$$file eq'..);
返回if-d$文件;
如果()
{
my$path=file($file)->relative($sourceDir);
fcopy(“$sourceDir/$path”、“$destinationDir/$path”)或die“无法执行fcopy:$!”;
}
});
没有相对路径-目标文件夹结构似乎与源文件夹结构不同。我认为最简单的解决方案是完全复制目录结构,然后返回以确定要筛选的所有目录,然后删除它们 考虑到
.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);
或者,如果您想自己动手,您可以看看其中包括一个关于如何“忽略CVS目录”的示例.次要说明:报告已弃用,并建议改用。什么操作系统?如果要彻底排除点文件,您可能需要自行开发解决方案。该链接问题显示了如何使用File::Copy(OP中的去擦洗模块中的指针包装)递归复制符合条件的文件。具有遍历和递归函数,这些函数可以使用代码执行闭包。这将很容易用于对符合特定条件的文件执行递归复制。