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