我正在寻找一种简单的方法(一个命令或一系列命令,可能涉及find)在两个目录中查找重复文件,并将一个目录中的文件替换为另一个目录中文件的硬链接。
情况是这样的:这是一个文件服务器,多人在上面存储音频文件,每个用户都有自己的文件夹。有时,多人拥有完全相同的音频文件的副本。现在,这些都是重复的。我想让它们成为硬链接,以节省硬盘空间。
我在教科书中读到 Unix/Linux 不允许硬链接到目录,但允许软链接。是不是因为,当我们有循环,如果我们创建硬链接,一段时间后我们删除原始文件,它会指向一些垃圾值?
如果循环是不允许硬链接的唯一原因,那么为什么允许软链接到目录?
我想创建一个目录树的“副本”,其中每个文件都是原始文件的硬链接
示例:我有一个目录结构:
dirA/
dirA/file1
dirA/x/
dirA/x/file2
dirA/y/
dirA/y/file3
Run Code Online (Sandbox Code Playgroud)
这是预期的结果,目录树的“副本”,其中每个文件都是原始文件的硬链接:
dirB/ # normal directory
dirB/file1 # hardlink to dirA/file1
dirB/x/ # normal directory
dirB/x/file2 # hardlink to dirA/x/file2
dirB/y/ # normal directory
dirB/y/file3 # hardlink to dirA/y/file3
Run Code Online (Sandbox Code Playgroud) 我正在创建一个 shell 脚本,它将获取文件的文件名/路径并确定该文件是符号链接还是硬链接。
唯一的问题是,我不知道如何查看它们是否是硬链接。我创建了 2 个文件,一个是硬链接,一个是符号链接,用作测试文件。但是我如何确定一个文件是一个硬链接还是一个 shell 脚本中的符号?
另外,我如何找到符号链接的目标分区?因此,假设我有一个链接到不同分区的文件,我如何找到该原始文件的路径?
我们如何找到给定文件的所有硬链接?即,找到指向同一文件的所有其他硬链接,给出一个硬链接?
文件系统是否跟踪文件的硬链接?
文件的 inode 只存储文件的硬链接数,而不存储硬链接,对吗?
我已经看到很多解释为什么基于 Unix 的操作系统中空目录的链接数是 2 而不是 1。他们都说这是因为 '.' 目录,每个目录都指向它自己。我明白为什么会有一些“。”的概念。对于指定相对路径很有用,但是在文件系统级别实现它有什么好处?为什么不让 shell 或采用路径的系统调用知道如何解释它呢?
'..' 是一个真正的链接对我来说更有意义——文件系统需要存储一个指向父目录的指针才能导航到它。但我不明白为什么“。” 成为一个真正的链接是必要的。它似乎也导致了实现中的一个丑陋的特殊情况——你会认为你只能释放链接数小于 1 的 inode 使用的空间,但如果它们是目录,你实际上需要检查一个链接数小于 2。为什么不一致?
如何将具有共同文件的目录从一个分区移动到另一个分区?
让我们假设我们已经挂载了/mnt/X带有硬链接共享文件的目录的分区。如何将这些目录移动到另一个分区,让它/mnt/Y保留那些硬链接。
为了更好地说明“与硬链接共享文件的目录”是什么意思,这里是一个例子:
# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a
Run Code Online (Sandbox Code Playgroud)
更具体地说,假设文件的总大小为 10G,每个文件有 10 个硬链接。问题是如何使用 10G 将它移动到目的地(有人可能会说用 100G 复制它然后运行重复数据删除 - 这不是我要问的)
hard-link ×10
files ×5
filesystems ×4
symlink ×3
cp ×2
directory ×2
linux ×1
recursive ×1
shell ×1
shell-script ×1