du 跳过符号链接

du 跳过符号链接

我的系统上的默认行为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将跳过符号链接。因此,在finddu、 和之间创建一个邪恶的联盟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 不遵循任何符号链接(这是默认值)

相关内容