【问题标题】:Recursive directory copy in perl preserving mode and ownership, without contentperl保留模式和所有权的递归目录副本,没有内容
【发布时间】:2015-10-26 15:45:47
【问题描述】:

使用 perl 我想在本地复制一个没有内容的目录结构,但保留所有者和模式。我找到了File::Copy::Recursive,它提供了dircopy,除了保留所有权之外,它可以做所有事情。有没有办法在不显式遍历新旧目录并比较所有者的情况下实现这一点?当然,这需要在实现的某个地方发生,但我想知道它是否已经在某个地方实现,这样我就不必重新发明它。

编辑:原来dircopy 也复制文件,所以它不是我想要的。

【问题讨论】:

  • 是的,模式被保留,这对我有用。对我来说缺少的是保留所有权,这与模式不同。
  • 除非您是 root,否则您无法保留所有权。你是根吗?

标签: perl recursion copy


【解决方案1】:

如果您不需要便携性,我会使用系统提供的工具。它们会更快、更可靠。 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 执行以保留所有权。

【讨论】:

  • 这是一个很好的解决方案。在重新评估了我的需求后,我最终选择了自己,我将发布。
【解决方案2】:

我最终自己动手了:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2016-12-18
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多