我在 btrfs 文件系统的各个目录中有很多文件。它们都是相同的,有些可能是使用“旧式”完整副本创建的,有些是克隆的(cp --reflink
)。我想知道是否有任何非克隆的。
在某些情况下,可能会有旧式副本的克隆,请参见cp
下面的示例。在这种情况下, 的输出btrfs fi du
毫无帮助:所有文件都0.00B
在 列中Exclusive
,并且 列中有一些内容Set shared
。但不一定一共享集。所以我无法btrfs fi du
区分它们。我该怎么做?
我认为这还不够详细,难以理解(但我想先提出这个问题),所以这里有一个更详细的例子。假设我有两对文件;每对文件的成员都是克隆。换句话说,我这样做了:
dd if=/dev/urandom of=a1 count=1 bs=1M
cp --reflink=always a1 a2
cp --reflink=never a1 b1
cp --reflink=always b1 b2
当然,这些文件将占用磁盘上的 2MB 空间(每个 x2 与 x1 共享其范围)。
我可以使用btrfs fi du .
(最后一行)看到这一点
Total Exclusive Set shared Filename
1.00MiB 0.00B - ./a1
1.00MiB 0.00B - ./b1
1.00MiB 0.00B - ./a2
1.00MiB 0.00B - ./b2
4.00MiB 0.00B 2.00MiB .
但是,我无法通过以下方式看到它btrfs fi du *
:
Total Exclusive Set shared Filename
1.00MiB 0.00B 1.00MiB a1
1.00MiB 0.00B 1.00MiB a2
1.00MiB 0.00B 1.00MiB b1
1.00MiB 0.00B 1.00MiB b2
这里,我没有最后一行。我无法区分这种情况(两对)和所有四个文件都在一个共享集中的情况(换句话说,cp a1 a2; cp a1 b1; cp a1 b2
所有文件都带有--reflink=always
);输出将完全相同。
显然,如果所有这些文件都在同一个目录中,我只需使用fi du .
。但如果它们在不同的目录中,我就无法做到这一点。我如何才能获得“最后一行”来告诉我它是单个共享集还是多个单独的共享集?
答案1
显然,如果所有这些文件都在同一个目录中,我只需使用
fi du .
。但如果它们在不同的目录中,我就无法做到这一点。我如何才能获得“最后一行”来告诉我它是单个共享集还是多个单独的共享集?
使它们位于同一目录中。
- 创建一个临时目录。
ln
将所有相关文件添加到目录中(即创建硬链接)。可能会出现名称冲突,您可能需要将一些文件链接到修改后的名称。btrfs fi du .
在目录中运行。- 删除目录内的所有文件以及目录本身。