考虑以下场景:
- 我可以
rwx
作为目录的组 ID 的成员访问该目录。 - 系统管理员不允许用户运行
chown
(请参阅这个线程详情)
如何获得目录的递归所有权?
我相信我可以做以下事情,假设我想拥有A
cp -R A B
rm -R A
mv B A
A
但这很乏味,并且如果很大的话可能需要大量空间。
答案1
您可以像这样获取所有权:
$ mv A A.old
$ mkdir A
$ mv A.old/* A.old/.[!.]* A.old/..?* A/
$ rmdir A.old
答案2
您实际上只需要获得目录的所有权。普通文件将在您下次修改它们时自行处理,符号链接和管道并不重要,并且我将假设没有设备或其他外来类型。
您可以制作目录的递归副本,但从常规文件创建硬链接而不是复制它们。使用 GNU coreutils(Linux、Cygwin):
cp -al A B
每个常规文件A/dir/file
都硬链接为B/dir/file
.然后您可以删除源树。
如果您没有 GNU coreutils,您可以使用 rsync 代替:
cd A
rsync -a --link-dest=$PWD . ../B
为了确保删除 A 实际上不会删除任何文件,请检查所有常规文件的硬链接计数是否至少为 2 — 以下命令不应输出任何内容:
find A -type f -links 1
答案3
任何不涉及复制的方法都会遇到 no-chown 规则。请 root 为你做这件事。
如果您雄心勃勃,您可以编写一个新的类似 chown 的实用程序,专为 setuid-root 安装而设计,它会进行自己的安全检查,并根据更宽松的规则决定是否允许 chown。
如果主要是关于磁盘空间,您只需要一个将 cp 与 rm 交错的工具...