在 Unix/Linux 中将文件移动到不同目录所需的权限 [关闭]
Posted
技术标签:
【中文标题】在 Unix/Linux 中将文件移动到不同目录所需的权限 [关闭]【英文标题】:Permissions required to move file to different directory in Unix/Linux [closed] 【发布时间】:2014-01-23 19:07:12 【问题描述】:我想澄清所需的权限,以便将文件 A 从目录 B 移动到目录 C(我认为命令是“mv B/AC/A”),名称不变。
我认为以下是必需的是否正确?
-
进行移动的用户/组必须对目录 B 具有写入权限(或 B 必须设置权限标志以允许所有用户/组写入)
进行移动的用户/组必须对目录 C 具有写入权限(或 C 必须设置权限标志以允许所有用户/组写入)
进行移动的用户/组必须对文件 A 具有写入权限(或 A 必须设置权限标志以允许所有用户/组写入)
谢谢。
【问题讨论】:
这是个好问题,但我认为它属于unix.stackexchange.com 但是这里我们也有一个标签file-permissions
,所以把它读作“在我让我的脚本执行指定类型的mv
之前我必须检查什么条件”;-)
对不起,我不知道还有其他 UNIX 问题站点。今后我会牢记这一点。
【参考方案1】:
实际上,移动文件要么是在单个文件系统上重命名文件,要么是创建副本并删除原始文件(通常仅当移动是从一个文件系统迁移到另一个文件系统时才会这样做)。
在任何一种情况下,您都需要执行和当然写入目标目录和源目录的权限。但是,对于单个文件系统上的仅仅重命名(从一个目录移动到另一个目录可能就是这样),您确实不需要需要any文件本身的权限。它可以清除所有权限,但您仍然可以移动(重命名)它(只要您对目录具有 write 和 execute 权限)。
对于真正的副本(当您将文件移动到不同的文件系统时需要它),您需要对文件本身具有读取权限。 无写入权限是必需的,因为删除文件不是写入文件(而是写入文件所在的目录)。
【讨论】:
谢谢。只是为了确保我对您的理解正确:在同一个文件系统中移动文件(带/不带重命名),不需要对文件的权限;将文件(带/不带重命名)移动到不同的文件系统,文件需要 r 权限;在这两种情况下,都需要目录的 w 和 x 权限。 是的,你总结的没错。只有一件事:一个一个文件系统重命名和移动是完全一样的; “移动”只是重命名目录条目的完整路径(即说明其父目录的部分),而不仅仅是目录条目的基本名称(最后一个斜杠之后的部分)。它是通过系统调用rename(2)
完成的;像mv
这样的工具测试是否可以使用它,并且只有当它不可用(不同的文件系统或文件系统不支持)时才回退到复制和删除。
啊,还有一个我忘了提的含蓄:你还需要对源目录和目标目录的all父目录拥有执行权限.也许你想看看系统调用access(2)
可以用来检查这些东西。
@Alfe 你能解释一下为什么在“真正的副本”的源目录上需要 write / execute 吗?换句话说,如果我可以读取目标,我就不能将其内容“复制”到内存中吗?
目标目录需要执行和写入权限才能在其中创建新目录条目。在源目录上需要它们来删除那里的目录条目(这里的主题是移动文件,在目录级别这就是移动的意思)。对于单独创建副本,只需要对源文件的读取权限和对其所有(父)目录的执行权限。但请仔细阅读我的回答:在一个文件系统上移动文件不一定需要读取它,因为没有复制。以上是关于在 Unix/Linux 中将文件移动到不同目录所需的权限 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何在PHP中将所有文件和文件夹从一个目录移动到另一个目录?
启动脚本_《UNIX/LINUX 系统管理技术手册 第四版》