![是否可以使用索引节点重命名文件或目录?](https://linux22.com/image/74342/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E7%B4%A2%E5%BC%95%E8%8A%82%E7%82%B9%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
我将 /home 目录更改为不同的分区,但无法从中访问文件,这是我能够从这个问题解决的问题 -切换到不同分区后如何访问先前安装的内容?。
如果我之前记下目录的索引节点,我可以单独使用它来重命名目录吗?
答案1
您可以仅使用 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
如果一切顺利,请注销并以您自己的身份重新登录,一切都会好起来的。
顺便说一句,仅使用其 inode 信息重命名文件的命令(假设该文件位于当前目录中)是:
find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;
123456789
当然,inode 号在哪里。 (请注意,find
确定文件名及其路径并将此信息传递给mv
;如果没有,根本无法重命名文件涉及以任何方式现有的文件名,但如果只是你不这样做知道文件名,很简单。)
答案2
在典型的 Unix 文件系统中,通常在结构上不可能基于 inode 移动文件。原因是重命名文件意味着从包含该文件的目录中删除其目录条目,并在其他位置创建目录。但 inode 不包含指向目录项的指针,它只包含(指向)文件元数据(时间戳、权限等)和文件内容。
对于具有多个硬链接的文件,您将重命名其中的哪一个? inode 信息不足。
对于某些文件系统上的目录,可以仅根据 inode 进行操作:
- 读取目录的内容,从inode肯定是可达的。
- 找到 的目录条目
..
。这指向父目录。 - 在父目录中,查找具有正确 inode 编号的目录条目。
然而,这做出了几个假设:
- 如果同一个 inode 有多个条目怎么办?实际上,这不是问题:这在实践中几乎不会发生,因为大多数 UNIX 变体都禁止对目录的显式硬链接。
..
首先存在吗?这取决于文件系统类型。某些文件系统有一个显式条目..
;对于其他人来说,这些条目是由文件系统驱动程序伪造的。如果..
不存在,这种方法基本上是不可能的。- 即使文件系统确实包含
..
链接,还有另一个可能并不明显的绊脚石:步骤 1 在内核内部可能是可能的,但没有它的接口。许多 UNIX 变体没有允许通过其 inode 打开文件的接口,因为这会绕过权限。例如,位于具有权限(即只能由其所有者访问)rwxr-xr-x
的目录中的具有权限(即世界可读)的文件rwx------
除了目录所有者之外任何人都无法访问。这不能仅通过 inode 来确定 - 该文件实际上可以通过另一个硬链接访问!
结果是,不,对于仅给出其索引节点的文件,不可能执行任何操作,包括重命名。您需要有该文件的路径。
对给定 inode 的文件进行操作的唯一实用方法是首先找到路径,例如使用find -inum
,然后使用该路径进行操作。这对您的情况没有帮助,文件被安装点遮蔽。没有可移植的方法来访问挂载点隐藏的文件;正如您所发现的,在 Linux 上,您可以使用绑定安装。
答案3
谢谢。这非常有帮助。它允许我将从 YouTube 下载的视频文件副本的繁琐名称更改为更简洁但仍然有意义的文件名。例如:
you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs
...给我文件:
20191129_塔克.webm;以及“今晚拯救塔克·卡尔森 19 年 11 月 29 日完整版 - 福克斯新闻 2019 年 11 月 29 日.en.srt”
我认为这是一个非常有用的东西的缺点。
我可以更改第二个文件名,如下所示:
$ls -il“今晚拯救塔克·卡尔森 19 年 11 月 29 日完整版 - 福克斯新闻 2019 年 11 月 29 日.en.srt”
...这为我提供了文件列表,其索引节点号位于开头:
13902671 -rw-r--r-- 1 james james 55793998 十一月 30 日 18:44 今晚拯救塔克·卡尔森 19-11-29 完整-突发福克斯新闻 2019年11月29日.en.srt
...然后我跑:
mvi 13902671 20191129_塔克.srt
我的 mvi bash shell 脚本是:
#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;