簡體   English   中英

如何復制除 Perl 中所有隱藏文件之外的目錄?

[英]How can I copy a directory except for all of the hidden files in Perl?

我有一個包含一堆文件的目錄層次結構。 一些目錄以. . 我想將層次結構復制到其他地方,省去所有以.

怎么能這樣呢?

我想你想要的是File::Copy::Recursivercopy_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 \&copy_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM