Ben*_*ird 23 size hard-link disk-usage files
我使用 rsnapshot 进行备份,它会生成一系列包含同名文件的文件夹。一些文件是硬链接的,而其他文件是分开的。例如,hourly.1/file1andhourly.2/file1可能硬链接到同一个文件,而hourly.1/file2和hourly.2/file2是完全独立的文件。
我想找到hourly.2 忽略任何文件的文件夹使用的空间量,这些文件是hourly.1. 所以在上面的例子中,我想获得 file2 的大小,但忽略 file1。
我在 linux 上使用 bash,我想尽可能简单地从命令行执行此操作,因此请不要使用大型图形或其他操作系统解决方案。
Gil*_*il' 14
如果您特别想要存在于下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'
Run Code Online (Sandbox Code Playgroud)
(适用于任何 POSIX 系统和大多数其他 Unix 变体。假设目录名称hourly.1不包含任何换行符。)
tuk*_*k0z 13
正如@Gilles 所说,由于du只计算指向它遇到的同一个 inode 的所有硬链接中的第一个,因此您可以连续给它目录:
$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
1G /hourly.2
30G total
Run Code Online (Sandbox Code Playgroud)
即,'hourly.2' 中引用一个 inode(又名“真实”文件)的任何文件都不会被计算在内。
gre*_*eke 11
hourly.2只有一个链接的所有文件的总大小(以字节为单位):
$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'
Run Code Online (Sandbox Code Playgroud)
从find手册页:
-links n
File has n links.
Run Code Online (Sandbox Code Playgroud)
要获得以千字节而不是字节为单位的总和,请使用 -printf "%k\n"
要列出具有不同链接数的文件,请使用find -links +1(多于一个链接)、find -links -5(少于五个链接)等等。
小智 5
更简单
du -hc --max-depth=1 path/
Run Code Online (Sandbox Code Playgroud)
例子
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
...
Run Code Online (Sandbox Code Playgroud)