为什么这个不显示隐藏的文件/文件夹?

我正在使用du -sch ./*命令浏览我的系统,以找出那些可能没有任何理由积累的大型无用文件时,我发现了这个。
$ du -sch ./*
du: cannot read directory ‘./drbunsen/.gvfs’: Permission denied
du: cannot read directory ‘./drbunsen/.cache/dconf’: Permission denied
18G ./drbunsen
18G total

$ cd drbunsen/
$ du -sch ./*
601M ./Desktop
20K ./Documents
598M ./Downloads
4.0K ./flash
4.0K ./Music
8.0M ./Pictures
4.0K ./Public
4.0K ./Templates
4.0K ./Ubuntu One
8.0K ./Videos
11G ./VirtualBox VMs
6.9M ./workspace
12G total

如何让隐藏文件可见?du -sch ./.*du -sch ./*得到的结果是一样的。

2du -hs .[^.]* * 是用来查看所有隐藏文件的命令,不包括 ...,其他答案似乎都忽略了这一点。 - laggingreflex
1这里的声望不够,无法回答这个非常活跃的问题,所以只能快速评论一下。如果在bash下,你可以通过使用dotglob shell选项来“修复”这个问题。我在这里使用一个子shell,以免对其他命令产生全局影响 => (shopt -s dotglob; du -shc *) - Zeitounator
第二个 * 是做什么用的? - undefined
谢谢,@Zeitounator。我也学到了()是用来启动子shell的。 - undefined
5个回答

使用

du -sch .[!.]* * |sort -h

在你的个人文件夹中。
另外,我最常用的命令是
ncdu

如果需要安装,非常容易:

sudo apt-get install ncdu

1谢谢,你真是个天才。 我不是Bash的专家,[!.] 是什么意思? - Dr_Bunsen
11@Dr_Bunsen:这是一个包含以单个.开头的所有文件的通配符列表。这里有一个巧妙的技巧:如果你不知道一个看起来像通配符的东西是干什么的,试着运行echo .[!.]*或其他类似的命令。Shell会将通配符扩展并传递给echo,打印出结果文件的列表。 - Tikhon Jelvis
17无法列出文件名类似 ..foo 的文件,并且可能会导致文件名以 - 开头的文件出现问题。如果参数列表过长,它也可能失败。du -ahd1 将不会有这些问题。 - Stéphane Chazelas
1与原问题无关,但与日常使用相关: 在这个命令中,可能会有用的是包含一个“c”开关来显示总数,并稍微重新排序选项,以使这个命令更容易记住:du -cksh .[!.]* * |sort -h - Daddy32
不错的全局。但是只有在顶层实际上有隐藏文件时才有效。目录内部的隐藏文件仍然不会被计算。感谢您使用ncdu - Hinz

我在coreutils邮件列表中有同样的问题,因为我很难记住@don.joey给出的这个奇怪的命令。Bob Proulx 提议了一个更好、更自然的命令:

du -ahd1 | sort -h

如果你想列出当前目录中的所有文件,可以使用'.'或者根本不给它任何文件参数。此外,你可能还想使用-d、--max-depth=N选项。

试试这个:

du -hd1


8添加-a选项使其等效。 - Stéphane Chazelas
8这个答案应该被接受,因为它更简单、更容易记住和理解。 - Bastien

当您在目录中运行相同的命令时,它不会包括以.开头的隐藏文件在内。例如,如果您安装了Steam,默认情况下会将游戏安装在~/.local/share/Steam/目录下,而Steam本身也会安装在该目录下。
在bash下,您显然需要运行du -sch .[!.]* *,因为它无法正确展开.*通配符。而在zsh或其他shell下,du -sch * .*应该可以工作,因为.*应该会展开成包含当前目录中所有隐藏文件列表的列表。

2好的。显然,bash存在问题,因为它似乎无法正确展开.*。但是在zsh下,du -sch * .*确实可以正确执行。在bash下,du -sch .*似乎会计算.,但不会展开以显示各个文件。 - dobey
对我来说,*也扩展到../*,因此du命令会跳出我想要查看大小的目录!我不得不使用./.[^.]*代替。 - Ari
这是zsh以及所有派生自Forsyth shell的外壳(现在主要是pdksh及其派生物)能够正确处理,并且不会扩展...。而其他类似Bourne的外壳(如bash、Bourne、AT&T ksh、dash、yash等)都会扩展...。在zsh中,你可以使用du -sch -- *(D),而不是du -sch -- * .* - Stéphane Chazelas

这也适用于显示隐藏的文件和目录:
du -sch $(ls -A .) | sort -h

2这个命令对于文件或目录名中包含空格字符的情况无效。 - karel

我认为du实用程序默认没有命令行开关来处理隐藏文件。
一种实现这个目标的方法是使用find实用程序来查找你感兴趣的隐藏文件,然后对每个条目运行du实用程序。
find ./ -maxdepth 1 -name '.*' -exec  du -hs {} \;

这样做可以让您更加灵活,因为您可能只对目录感兴趣。
find ./ -maxdepth 1 -type d -name '.*' -exec  du -hs {} \;

或者您可能希望查看当前工作目录深处的所有隐藏文件和目录:

find ./ -name '.*' -exec  du -hs {} \;

不过,对于输出进行排序并不困难,这样你就可以轻松识别出那些能帮助你节省磁盘空间的大型隐藏文件。
{ find ./ -maxdepth 1 -iname '.*' -exec  du -hs \{\} \; ;} | sort -h