perl保留模式和所有权中的递归目录复制,没有内容

时间:2015-10-26 15:45:48

标签: perl recursion copy

使用perl我想在本地复制没有内容的目录结构,但保留所有者和模式。我发现File::Copy::Recursive提供dircopy,除了保留所有权外,它会执行所有操作。有没有办法实现这一点,而无需显式遍历旧目录和新目录并比较所有者?当然,在实现的某个地方,这需要发生,但我想知道它是否已经在某处实现,以便我不必重新发明它。

编辑:事实证明dircopy也复制了文件,所以它不是我想要的。

2 个答案:

答案 0 :(得分:3)

如果您不需要便携性,我会使用系统提供的工具。它们会更快,更可靠。 tar可以重新创建权限和所有权。

如果你想复制目录和文件,那就很简单了:

( cd "$SRC" ; tar c ) | ( cd "$DST" ; tar x --preserve --same-owner )

但是你要求重新创建没有内容的目录结构。为此,您可以使用以下内容:

( cd "$SRC" ; find -type d -exec \
   sh -c 'tar c --no-recursion "$@" | ( cd "$DST" ; tar x --preserve --same-owner )' \
      dummy {} + )

$SRC$DST分别是基本源和目标目录。

当然,这些命令需要以root执行才能保留所有权。

答案 1 :(得分:0)

我结束了自己:

sub dirCopy {
    my $old = shift;
    my $new = shift;
    if( -d $new ){return(1)}
    my $old_base = dirname($old);
    my $new_base = dirname($new);
    unless( -d $new_base ){dirCopy($old_base, $new_base)}
    my @old_stat = stat($old) or die("Could not stat $old");
    my $old_mode = $old_stat[2];
    my $old_uid = $old_stat[4];
    my $old_gid = $old_stat[5];
    mkdir($new) or die("Could not mkdir $new");
    chown($old_uid, $old_gid, ($new)) or die("Could not chown $new");
    chmod($old_mode, ($new)) or die("Could not chmod $new");
    return(1);
}