我的系统上的默认行为du
不是正确的默认行为。
如果我ls
的/data
文件夹,我会看到(删除不重要的内容):
ghs
ghsb -> ghs
hope
rssf -> roper
roper
每个文件夹内都有一组以数字作为名称的文件夹。我想获取所有名为 的文件夹的总大小14
,因此我使用:
du -s /data/*/14
我看到...
161176 /data/ghs/14
161176 /data/ghsb/14
8 /data/hope/14
681564 /data/rssf/14
681564 /data/roper/14
我想要的只是:
161176 /data/ghs/14
8 /data/hope/14
681564 /data/roper/14
我不想看到符号链接。我尝试过-L
、、-D
等-S
。我总是得到符号链接。有办法去除它们吗?
答案1
这并不是du
解析符号链接;而是解析符号链接。这是你的外壳。
*
是一个外壳球体;它在运行任何命令之前由 shell 展开。因此,实际上,您正在运行的命令是:
du -s /data/ghs/14 /data/ghsb/14 /data/hope/14 /data/rssf/14 /data/roper/14
如果您的 shell 是 bash,则无法告诉它不要扩展符号链接。但是您可以使用find
(GNU 版本)代替:
find /data -mindepth 2 -maxdepth 2 -type d -name 14 -exec du -s {} +
答案2
使du
跳过符号链接:
du
不够聪明,不能不追逐链接。默认情况下find
将跳过符号链接。因此,在find
、du
、 和之间创建一个邪恶的联盟awk
,正确的黑魔法咒语就变成了:
find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print total}'
生产:
145070492
强制输出为人类可读:
find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print (total / 1024 / 1024) "MB"}'
生产:
138.35MB
这里发生了什么:
/home/somedirectory/ directory to search.
-exec du -s + run du -s over the results, producing bytes
awk '...' get the first token of every line and add them up,
dividing by 1024 twice to produce MB
答案3
只需使用该标志-L
:
从手册页:
-L, --dereference
dereference all symbolic links
然后du计算大小,无论它们是否是符号性的。
答案4
du -P
-P, --no-dereference 不遵循任何符号链接(这是默认值)