是否可以使用 inode 重命名文件或目录?

vfc*_*sts 10 inode rename

我将 /home 目录更改为不同的分区,但无法从中访问文件,我已经能够从这个问题中解决一些问题 -在切换到不同的分区后如何访问先前安装的内容?.

如果我之前已经注意到目录的 inode,我是否可以单独使用它来重命名目录?

Wil*_*ard 6

您可以使用仅使用 inode 的知识来重命名文件(目录或其他)find,但是如果 (a) 包含它的文件系统未挂载,或者 (b) 有另一个文件系统挂载在包含您感兴趣的文件,您的系统根本无法访问该文件。在情况 (a) 中,您需要先挂载文件系统,然后才能对内容执行任何操作,包括重命名;在情况 (b) 中,您需要卸载挂载在包含以下内容的目录“顶部”的文件系统要重命名的文件。看起来您在询问案例 (b)。

如果我理解正确,您正在尝试使旧/home目录(位于根分区上)可访问,同时仍在使用安装在/home. 如果这就是您想要的,请执行以下操作:

关闭所有文件并注销。然后以身份登录root(为此使用虚拟终端——按 Ctrl-Alt-F2)运行以下命令:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,请注销并以您自己的身份重新登录,一切都应该没问题。

顺便说一句,仅使用其 inode 的知识(假设文件在当前目录中)重命名文件的命令是:

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;
Run Code Online (Sandbox Code Playgroud)

123456789当然,inode 号在哪里。(请注意,find确定文件名和路径,并通过这个信息mv,也没有办法在所有的重命名没有文件涉及以任何方式对现有的文件名,但如果它只是你不知道文件名,那是相当简单的。)


Gil*_*il' 6

在典型的 Unix 文件系统中,通常在结构上不可能基于 inode 移动文件。原因是重命名文件意味着从包含它的目录中删除它的目录条目,并在别处创建一个目录。但是 inode 不包含指向目录条目的指针,它只包含(指向)文件元数据(时间戳、权限等)和文件内容。

对于具有多个硬链接的文件,您会重命名其中的哪些?inode 信息不足。

对于目录,在某些文件系统上,可以单独使用 inode:

  1. 读取目录的内容,该目录肯定可以从 inode 访问。
  2. 找到 的目录条目..。这指向父目录。
  3. 在父目录中,查找具有正确 inode 编号的目录条目。

然而,这提出了几个假设:

  • 如果同一个 inode 有多个条目怎么办?实际上,这不是问题:这在实践中几乎不会发生,因为大多数 unix 变体都禁止显式硬链接到目录。
  • 是否..首先存在吗?这取决于文件系统类型。一些文件系统有一个明确的条目..;对于其他人,这些条目是由文件系统驱动程序伪造的。如果..不存在,这种方法从根本上是不可能的。
  • 即使文件系统确实包含..链接,还有另一个可能不明显的绊脚石:在内核中可能有第 1 步,但没有接口。许多 unix 变体没有允许通过其 inode 打开文件的接口,因为这会绕过权限。例如,rwxr-xr-x位于具有权限rwx------(即只有其所有者可访问)的目录中的具有权限(即世界可读)的文件除目录所有者外不能被任何人访问。这不能仅从 inode 确定 - 该文件实际上可以通过另一个硬链接访问!

结果是,不,不可能对仅给定 inode 的文件执行任何操作,包括重命名。你需要有一个文件的路径。

对给定 inode 的文件进行操作的唯一实用方法是首先找到一个路径,例如 with find -inum,然后使用该路径进行操作。这在您的情况下无济于事,文件被挂载点遮蔽。没有可移植的方式来访问挂载点隐藏的文件;在 Linux 上,正如您所发现的,您可以使用绑定安装。