如何将所有文件/目录属性克隆/复制到其他文件/目录?


15

我想将一个目录的属性(所有权,组,ACL,扩展属性等)复制到另一个目录,但不复制目录内容本身。

这不起作用:

cp -v --attributes-only A B
cp: omitting directory `A'           

注意:不一定必须是cp


1
您没有通过-r,因此它正在忽略目录。但是我想您只想复制属性,而不是内容?我只能想到丑陋的骇客。还要注意,它install可以保留SELinux上下文。
lynxlynxlynx 2012年


1
@吉尔斯,感谢您指出另一个话题。它解决了部分问题:所有权和模式。扩展属性呢?
格热戈日Wierzowiecki

1
@GrzegorzWierzowiecki恐怕很少有工具支持扩展属性。如果它们很重要,请使用killermist的rsync建议。
吉尔斯(Gilles)'所以

顺便说一句。以下是一些不错的示例,可能在其中看到xattrs的作用:KDE中的Dolphin的GUI:imgur.com/oguuJNm或浏览器下载文件的URL:参考:gist.github.com/gwpl/a00e18bc150f1e3518335335d13c5e46ad7 + freedesktop.org/ wiki / CommonExtendedAttributes + vhanda.in/blog/2014/07/tagging-your-files
Grzegorz Wierzowiecki

Answers:


13

经过在命令行上反复试验和错误之后,我想我已经找到了答案。但这不是一个cp相关的答案。

rsync -ptgo -A -X -d --no-recursive --exclude=* first-dir/ second-dir

这样做:

-p, --perms                 preserve permissions
-t, --times                 preserve modification times
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
-d, --dirs                  transfer directories without recursing
-A, --acls                  preserve ACLs (implies --perms)
-X, --xattrs                preserve extended attributes
    --no-recursive          disables recursion

以供参考

    --no-OPTION             turn off an implied OPTION (e.g. --no-D)
-r, --recursive             recurse into directories

最后的编辑肯定在那里很受欢迎。在第二个目录上带有或不带/的代码,最终看起来完全符合要求。
killermist 2012年

尾部的斜杠仅对第一个参数产生影响,而对第二个参数没有影响。手册页的第3或第4段USAGE对此进行了rsync(1)说明。
2012年

@ jw013,几个月前反复阅读rsync文档后,我的结论是,无论是第一个(第二个,第三个,等等)还是最后一个参数,斜杠都是隐含的“插入”。但是话又说回来,我经常在最后一个参数上以/结束命令,以暗示/要求“影响”。
killermist 2012年

我的直觉是要复制所有目录属性,而没有常规文件rsync -a -AX --include='*/' --exclude='*'。我还没测试
吉尔斯(Gillles)“所以-别再邪恶了”

@ jw013感谢您帮助拨出这个答案。我在我的小沙盒测试环境中尝试了很多选择,并且一直保持接近,但是其中的某些部分无法正常工作。
killermist 2012年

0
chmod --reference=first-dir second-dir

2
这将不会递归起作用,我相信它不会复制ACL或扩展属性。
2012年

1
它不应该是递归的:OP要求“不是目录内容本身”,并且接受的答案告诉rsync --no-recursive。这个答案的问题是它不执行ACL或XATTR。
ShadSterling


0

我不明白,因为它似乎对其他人有用,但是rsync方法对带有ZFS的FreeBSD来说对我来说失败了。什么都没发生。但是让-弗朗索瓦·多克斯(Jean-FrançoisDockes)的方法行之有效。(请参阅:https : //www.lesbonscomptes.com/pxattr/)源目录= A,目标目录= B,来自原始问题。

pxattr -lR A > tmp.EAs

(编辑tmp.EAs的第一行,将A目录更改为B,s / A / B /)

pxattr -S tmp.EAs

因此,您不仅在推荐其他人的方法,而且还建议您使用其他方法。您正在推荐其他人的程序对吧?没关系,但是我只花了五分钟的时间在一个鲜为人知的非标准程序上搜索文档。如果您更清楚地表明您建议人们下载鲜为人知的非标准程序,那将是很好的。
G-Man说'Reinstate Monica''18

耸耸肩 在端口树中。这并不完全使其成为非标准。它不那么模糊pyxattr,我也尝试过。这有点难以破解。据说gnu cp可以解决这个问题,但是我做不到。扩展属性应该比这更好。另外,pxattr至少在linux,osx和bsd下工作。
cira

0
rsync -aAX --exclude='*' src_dir/ dst_dir

其中dst_dir-是目标目录。要么:

rsync -dADXgot src_dir dst_dir

其中dst_dir-是包含目标目录的目录,或不存在的目标目录。

从rsync手册页:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
        --exclude=PATTERN       exclude files matching PATTERN

    -d, --dirs                  transfer directories without recursing
    -p, --perms                 preserve permissions
    -A, --acls                  preserve ACLs (implies -p)
    -X, --xattrs                preserve extended attributes
    -o, --owner                 preserve owner (super-user only)
    -g, --group                 preserve group
        --devices               preserve device files (super-user only)
        --specials              preserve special files
    -D                          same as --devices --specials
    -t, --times                 preserve modification times

-3

您需要“ -r”来复制目录。


2
我想我误会了您,您不需要内容,仅是xattr。如果用于SELinux,则可以使用chcon引用原始目录(A)。
2012年

-r暗含所有子目录和文件的副本...我不想复制整个树...我只想复制一个目录和一个目录的属性-而不会影响目录的内容。
Grzegorz Wierzowiecki 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.