如何获得忽略硬链接的文件夹大小?


16

我使用rsnapshot进行备份,该备份会生成一系列包含相同名称文件的文件夹。有些文件是硬链接的,而另一些是分开的。例如,hourly.1/file1hourly.2/file1可能硬链接到同一文件,而hourly.1/file2hourly.2/file2则是完全独立的文件。

我想查找该文件夹使用的空间量,hourly.2 而忽略与成为文件硬链接的任何文件hourly.1。因此,在上面的示例中,我想获取file2的大小,但忽略file1。

我在Linux上使用bash,我想从命令行尽可能简单地执行此操作,因此请不要使用大型图形解决方案或其他仅OS的解决方案。

Answers:


7

hourly.2只有一个链接的所有文件的总大小(以字节为单位):

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

find手册页:

   -links n
          File has n links.

要获得以千字节而不是字节为单位的总和,请使用 -printf "%k\n"

要列出具有不同链接数的文件,请依次使用find -links +1(一个以上的链接),find -links -5(少于五个的链接)等等。


1
如果某个文件中的某个文件硬链接到hourly2,则您的命令将处理错误的答案。
cuonglm 2014年

@Gnouc-是的-这取决于文件的最终格式hourly.2。如果将它们复制到那里,它们将没有多余的链接,并且我的命令将起作用。如果它们是硬链接的,显然它将失败。我假设复制了新的备份文件。
grebneke 2014年

11

如果您特别希望存在hourly.2但不存在的文件大小hourly.1,可以使用间接获取du。如果du多次处理同一个文件(即使使用不同的名称,即硬链接),则它只会在第一时间对文件进行计数。因此,du hourly.1 hourly.2报告的内容hourly.2就是您要寻找的尺寸。从而:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(可在任何POSIX系统和大多数其他Unix变体上使用。假定目录名hourly.1不包含任何换行符。)


由于某些奇怪的原因,du并不总是注意到RHEL5上的硬链接文件-如果我执行'du -sh dir / sub dir',则dir的输出与我刚刚说过'du -sh dir'相同-不排除大小'dir / sub'。
安德烈亚斯·克雷

8

正如@Gilles所说,由于du只计算指向它遇到的同一个inode的所有硬链接中的第一个,因此您可以连续为其指定目录:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

也就是说,“ hourly.2”中任何引用已经在“ hourly.1”中引用的索引节点(也称为“真实”文件)的文件都不会被计数。


2
根据du --help,选项--max-depth = 0等效于-s,因此上述内容可以缩短为:$ du -hcs dirA dirB
akavel

1

令人敬畏的是,BusyBox的构建find没有-printf支持。这是对@grebneke答案的修改:

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'

1

更简单

du -hc --max-depth=1 path/

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...

谢谢阿卜杜勒。这应该是公认的答案。
TiberiusKirk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.