在UNIX 环境中的高级编程(书籍)4.14节,解释i节点和目录,有一段:
当在不更改文件系统的情况下重命名文件时,不需要移动文件的实际内容 - 所需要做的就是添加一个指向现有 i 节点的新目录条目,然后取消旧目录条目的链接。例如,要将文件重命名
/usr/lib/foo
为,如果目录和位于同一文件系统上,则/usr/foo
不需要移动 foo 的内容。这就是该命令通常的运行方式。/usr/lib
/usr
mv
据此,文件的文件名应包含该文件的路径,并且“mv”并不真正移动该文件。但是为什么移动同一目录下的两个文件所花费的时间会根据它们的大小而不同呢?
答案1
- 路径名是从文件的目录条目返回根目录的路由推断出来的
/
。 - 文件的名称存储在其目录中,因此同一个“文件”可以同时被两个不同的事物调用。
- 在同一文件系统中移动文件所需的时间与文件大小无关。
针对您的发言:
文件的文件名应包含该文件的路径
该段落没有这样说,也没有类似的内容。也许是你没有引用的部分?
mv
并没有真正移动文件
是的,确实如此:该文件被放入一个新目录中 - 可能具有新名称 - 并从旧目录中删除。这是移动,但不是副本(文件的内容未移动,仅移动其在文件系统中的位置)。
例如,要将文件 /usr/lib/foo 重命名为 /usr/foo,如果目录 /usr/lib 和 /usr 位于同一文件系统上,则不需要移动 foo 的内容。
路径被分解为目录中的/usr/lib/foo
文件名。同样分解为下。如果和位于同一文件系统上,则重命名变为“与”操作(文件系统中文件的位置被移动;文件的内容保持不变)。foo
/usr/lib
/usr/foo
foo
/usr
/usr
/usr/lib
link
unlink