Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl递归地复制特定格式的文件_Perl_Recursion_File Io - Fatal编程技术网

Perl递归地复制特定格式的文件

Perl递归地复制特定格式的文件,perl,recursion,file-io,Perl,Recursion,File Io,注意:相关问题通过使用不推荐使用的模块解决,并且在整个操作系统中不一致。当前问题的答案使用了较新的模块,因此发布在这里 我有一个模块,它反过来使用CPAN模块递归地将文件从复制到 问题是-我只需要递归地将特定文件类型的文件复制到目标。有没有办法通过扩展来过滤源 作为替代方案-是否有办法复制除隐藏文件以外的所有文件?我的主要问题是.git文件夹也会被复制,这是不需要的 平台:MacOS 探讨的备选方案: 1) 文件::副本::递归模块:-似乎只提供文件或目录的递归副本。似乎对隐藏文件或排除筛选器都

注意:相关问题通过使用不推荐使用的模块解决,并且在整个操作系统中不一致。当前问题的答案使用了较新的模块,因此发布在这里

我有一个模块,它反过来使用CPAN模块递归地将文件从复制到

问题是-我只需要递归地将特定文件类型的文件复制到目标。有没有办法通过扩展来过滤源

作为替代方案-是否有办法复制除隐藏文件以外的所有文件?我的主要问题是.git文件夹也会被复制,这是不需要的

平台:MacOS

探讨的备选方案:

1) 文件::副本::递归模块:-似乎只提供文件或目录的递归副本。似乎对隐藏文件或排除筛选器都没有帮助

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

3) 类似于的国产解决方案:-可能是最后的选择-但除非在不同平台上进行调整和测试,否则似乎无法移植将退回到此状态,除非模块已经存在。

4) :-似乎有道理-将使用此功能运行快速实现

实施的解决方案:

我使用了递归模块和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: $!";
     }
 });
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中的去擦洗模块中的指针包装)递归复制符合条件的文件。具有遍历和递归函数,这些函数可以使用代码执行闭包。这将很容易用于对符合特定条件的文件执行递归复制。