【问题标题】:Perl recursively copy files of specific format [duplicate]Perl递归复制特定格式的文件[重复]
【发布时间】: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 具有遍历和递归函数,可以使用闭包来运行代码。这将很容易用于对符合特定条件的文件执行递归复制。

标签: perl recursion file-io


【解决方案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 目录”的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多