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