假设我有 n 个文件,a_1 到 a_n,所有文件都相互硬链接。此外,我有 m 个文件,b_1 到 b_m,彼此硬链接(但不硬链接到 a_* 文件)。
将 b_* 硬链接指向 a_* 文件的最聪明方法是什么?迭代 b_1 并将每个指向 a_1?或者有没有办法一起改变整个群体?
在知道 b 文件之一的情况下,如何找到所有 b_* 文件?即如何找到硬链接到给定文件的所有其他文件?最好用Python,而不扫描整个文件系统?
答案1
不,这些不能一起更改。原因在于所涉及的构造。为了便于讨论,文件分为三个部分:
- 文件名
- 一个索引节点
- 文件数据
指针运行的地方file names --> inode --> file data
。没有反向指针可以从索引节点获取文件名。
找到指向 inode 的文件名的唯一方法是搜索整个文件系统并检查每个文件名(不推荐)。
所以是的,您需要一一更改每个硬链接。
一个重要的说明。虽然您找不到硬链接,但您可以知道它们有多少。可能值得检查 a_* 或 b_* 是否有更多的硬链接。这样,您可以选择要销毁的链接较少的文件,并添加更多已经拥有最多的硬链接。
请记住,在 ext3 上,每个文件最多有 65,000 个硬链接。我之所以提到这一点,是因为我昨天遇到了这个问题。
答案2
文件名是指向 inode 的单向指针。在通常的 Unix 文件系统结构中,没有直接的方法来获取指针。
这意味着做你想做的事的唯一方法就是找到乙文件,取消链接并创建新链接A在他们的地方。你不可能一次性完成。
此外,您无法直接找到文件的硬链接,您必须扫描整个文件系统。 GNU 和 FreeBSD 版本(至少)有find
和-inum
测试-samefile
,可用于根据 inode 查找文件(名称)。
使用 GNU find,您应该能够执行类似的操作来查找硬链接的文件b
(包括b
其自身),并将它们替换为以下链接a
:
find -samefile b -exec sh -c 'ln -f a "$1"' sh {} \;