我将/ home目录更改为另一个分区,并且无法从该目录访问文件,我已经可以通过以下问题解决此问题- 在切换到另一个分区后,如何访问上一个挂载的内容?。
如果我之前已经记下了目录的索引节点,我是否可以单独使用它来重命名目录?
我将/ home目录更改为另一个分区,并且无法从该目录访问文件,我已经可以通过以下问题解决此问题- 在切换到另一个分区后,如何访问上一个挂载的内容?。
如果我之前已经记下了目录的索引节点,我是否可以单独使用它来重命名目录?
Answers:
您可以仅使用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
当然,索引节点号在哪里。(请注意,它find
确定文件名及其路径,并将此信息传递给mv
;在没有任何方式涉及现有文件名的情况下,根本无法重命名文件,但是如果只是您不知道文件名,那是相当不错的选择。简单。)
mv
不会以任何方式接受索引节点。
在典型的Unix文件系统中,通常在结构上不可能基于inode来移动文件。原因是重命名文件意味着从包含该文件的目录中删除其目录条目,并在其他位置创建目录。但是inode不包含指向目录条目的指针,它仅包含(指向)文件元数据(时间戳,权限等)和文件内容。
对于具有多个硬链接的文件,您将重命名哪个?索引节点信息不足。
对于目录,在某些文件系统上,仅给定索引节点就可以执行操作:
..
。这指向父目录。但是,这有几个假设:
..
首先存在吗?这取决于文件系统类型。一些文件系统有一个明确的条目..
; 对于其他用户,这些条目被文件系统驱动程序伪造。如果..
不存在,从根本上讲这种方法是不可能的。..
链接,也有另一个绊脚石可能并不明显:第一步可能在内核中进行,但没有接口。许多unix变体都没有允许通过其inode打开文件的接口,因为那样会绕过权限。例如,rwxr-xr-x
位于具有权限rwx------
(即,仅其所有者可以访问)的目录中的,具有权限(即,世界可读)的文件对目录所有者以外的任何人都是不可用的。这不能仅通过inode来确定-实际上可以通过另一个硬链接访问该文件!结果是,不可以,仅给文件指定索引节点的文件就不可能做任何事情,包括重命名。您需要具有该文件的路径。
给定文件的索引节点,对文件进行操作的唯一实用方法是首先找到路径,例如使用find -inum
,然后使用该路径进行操作。这对您的情况无济于事,在这种情况下文件会被安装点遮盖。没有可移植的方法来访问挂载点所隐藏的文件。在Linux上,您已经发现,可以使用绑定安装。
谢谢。这是最有用的。它使我可以将从YouTube下载的视频文件的抄本的繁琐名称更改为更简洁但仍有意义的文件名。例如:
you-get -O 20191129_tucker https://www.youtube.com/watch?v=cyCpkwX9Wvs
...给我文件:
20191129_tucker.webm; 和“拯救塔克·卡尔森今晚(11-29-19 FULL- Breaking Fox News)十一月29,2019.en.srt”
我认为这是您获得的非常有用的缺点。
我可以按如下方式更改第二个文件名:
$ ls -il“拯救塔克·卡尔森今晚(11月29日至19日已全部-最新福克斯新闻),2019年11月29日。en.srt”
...这给了我文件列表,它的索引号刚好在开头:
13902671 -rw-r--r-- 1 james james 55793998 Nov 30 18:44 Saving Tucker Carlson Tonight 11-29-19 FULL- Breaking Fox News November 29,2019.en.srt
...然后我运行:
mvi 13902671 20191129_tucker.srt
我的mvi bash shell脚本是:
#!/bin/bash
inodeNumber=$1
newFileName=$2
find . -maxdepth 1 -inum $inodeNumber -exec mv {} $newFileName \;
mvi
脚本使用未加引号的变量,这意味着,如果给脚本的任何参数包含空格字符(或者当它们包含通配符时,也可能会失败)。