[英]How can I copy a directory except for all of the hidden files in Perl?
我有一個包含一堆文件的目錄層次結構。 一些目錄以.
. 我想將層次結構復制到其他地方,省去所有以.
怎么能這樣呢?
我想你想要的是File::Copy::Recursive的rcopy_glob()
:
rcopy_glob()
這個函數讓你指定一個適合 perl 的 glob() 的模式作為第一個參數。 隨后 perl 的 glob() 返回的每個路徑都被 rcopy()ied。
它返回一個數組,其項目是包含每個 rcopy() 調用的返回值的數組引用。
它強制行為就像 $File::Copy::Recursive::CPRFComp 為真一樣。
如果你不用 Perl 也能解決這個問題,你應該看看rsync
。 它可以在類 Unix 系統上、通過 cygwin 在 Windows 上使用,也可以作為 Windows 上的獨立工具使用。 它會做你需要的,還有更多。
rsync -a -v --exclude='.*' foo/ bar/
如果您不是所有文件的所有者,請使用-rOlt
而不是-a
。
Glob 默認忽略點文件。
perl -lwe'rename($_, "foo/$_") or warn "failure renaming $_: $!" for glob("*")'
例如,下面的代碼以簡單的方式完成這項工作,但不處理符號鏈接。
#! /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;
cp -r .??*
幾乎完美,因為它錯過了以 . 然后是一個單一的符號。 像 - .d 或 .e
echo .[!.] .??*
這更好
或者:
shopt -s dotglob ; cp -a * destination; shopt -u dotglob
我找到了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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.