我有一堆文件的目录层次结构。一些目录以.
开头。
我想在其他地方复制层次结构,省略所有以.
怎么能这样做?
答案 0 :(得分:3)
我认为你想要的是File::Copy::Recursive的rcopy_glob()
:
rcopy_glob()
此功能可让您指定一个 适合perl的glob()的模式 第一个论点。随后各自 perl的glob()返回的路径获取 rcopy()组卷。
返回其项目所在的数组 包含返回的数组引用 每个rcopy()调用的值。
它强制行为就好像 $ File :: Copy :: Recursive :: CPRFComp is 真。
答案 1 :(得分:3)
如果您能够在没有Perl的情况下解决此问题,则应该查看rsync
。它可以在类Unix系统上,在Windows上通过cygwin获得,也可以作为Windows上的独立工具。它会做你需要的东西以及更多。
rsync -a -v --exclude='.*' foo/ bar/
如果您不是所有文件的所有者,请使用-rOlt
代替-a
。
答案 2 :(得分:0)
Glob默认忽略点文件。
perl -lwe'rename($_, "foo/$_") or warn "failure renaming $_: $!" for glob("*")'
答案 3 :(得分:0)
下面的代码以简单的方式完成工作,但不处理符号链接,例如。
#! /usr/bin/perl
use warnings;
use strict;
use File::Basename;
use File::Copy;
use File::Find;
use File::Spec::Functions qw/ abs2rel catfile file_name_is_absolute rel2abs /;
die "Usage: $0 src dst\n" unless @ARGV == 2;
my($src,$dst) = @ARGV;
$dst = rel2abs $dst unless file_name_is_absolute $dst;
$dst = catfile $dst, basename $src if -d $dst;
sub copy_nodots {
if (/^\.\z|^[^.]/) {
my $image = catfile $dst, abs2rel($File::Find::name, $src);
if (-d $_) {
mkdir $image
or die "$0: mkdir $image: $!";
}
else {
copy $_ => $image
or die "$0: copy $File::Find::name => $image: $!\n";
}
}
}
find \©_nodots => $src;
答案 4 :(得分:0)
cp -r .??*
几乎完美,因为它错过了以文件开头的文件。然后是一个单一的标志。喜欢 - .d或.e
echo .[!.] .??*
这是更好的
或:
shopt -s dotglob ; cp -a * destination; shopt -u dotglob
答案 5 :(得分:0)
我找到了 File::Copy::Recursive 的 rcopy_glob()。
以下是文档中显示但具有欺骗性的内容。
use File::Copy::Recursive qw(fcopy rcopy dircopy fmove rmove dirmove);
它不导入 rcopy_glob() 并且我发现使用它的唯一方法是如下所示:
use File::Copy::Recursive;
File::Copy::Recursive::rcopy_glob("glob/like/path","dest/path");