有什么命令行的方法可以找到大文件/目录并删除以释放空间?

寻找一系列命令,能够显示驱动器上最大的文件。

有没有图形化的东西可以吗? - RolandiXor
7不行,通过ssh在命令行上运行。 - Ryan Detzel
奇怪的是,我有两台运行相同内容的服务器。一台磁盘使用率为50%,而另一台则为99%。我找不到导致这种情况的原因。 - Ryan Detzel
所以我有点困惑,它说98%的du已经使用了,但是当我运行gt5应用程序时,我得到的结果是:http://grab.by/9Vv2 - Ryan Detzel
使用Nautilus建立SFTP连接,然后在磁盘使用分析器中打开远程位置。 - mckenzm
我个人喜欢这里提供的答案:https://unix.stackexchange.com/questions/728364/why-doesnt-df-show-the-filesystem-disk-space-of-the-path-that-i-give-it - Charlie Parker
13个回答

如果你只需要找到大文件,可以使用find命令配合-size选项。下面的命令将列出所有大于10MiB(不要与10MB混淆)的文件:
find / -size +10M -ls

如果你想找到特定大小之间的文件,可以将其与“小于某个大小”搜索结合使用。下一个命令会找到10MiB和12MiB之间的文件:
find / -size +10M -size -12M -ls

apt-cache search 'disk usage' 列出了一些可用于磁盘使用分析的程序。其中一个看起来非常有前途的应用是 gt5

根据软件包描述:

多年过去了,硬盘变得越来越大,但即使在这个巨大的硬盘时代,空间似乎也会随着时间消失。这个小而有效的程序提供比默认的 du(1) 更方便的列表显示。它显示自上次运行以来发生的情况,并显示目录大小和总百分比。可以使用基于文本的浏览器(如 links、elinks、lynx 等)的光标键导航和上升到目录。

Screenshot of gt5

gt5的“相关软件包”部分,我找到了ncdu。根据其软件包描述:
Ncdu是一个基于ncurses的du查看器。它通过著名的du实用程序提供了一个快速且易于使用的界面。它允许浏览目录并使用ncurses库显示磁盘使用百分比。

Screenshot of ncdu


7ncdu非常快速,正是我所需要的,谢谢!我也尝试过gt5,但是因为它在没有任何反馈的情况下“思考”时间太长,所以我取消了它。 - Lukas Liesis
18天哪,ncdu 真是太棒了,谢谢你分享这个发现! - While-E
3我希望ncdu能够更加突出地被指出来。我偶尔需要它,但是我记不住它的名字。 - Martin Thoma
不再需要记住命令了,多亏了ncdu :) - Mr Coder
你能以某种方式将“-h”选项(或其他选项)添加到“ls”中吗? - matanster
2@matt 没错,-ls 输出的格式是固定的(请参阅 pred_flslist_file 函数的源代码)。你可以尝试使用 -printf 选项来近似输出结果,然后使用 awk 进行后处理,或者使用类似 find ... -type f -exec ls -ldh {} \; | column -t 的方法。 - Lekensteyn
解释MiB与MB之间的区别时,给出链接是不好的做法。这不仅会切换上下文,还会使答案不自成一体。而且,如果链接发生变化、失效等情况,你的答案将部分无用。我强烈建议写下你心中的想法,即使只是一个简短的句子总结。 - Charlie Parker

我最喜欢的解决方案是结合了这些好答案中的几个。
du -aBM 2>/dev/null | sort -nr | head -n 50 | more

du 参数:

  • -a 用于显示所有文件和目录。如果只想显示目录,则不需要该参数。
  • -BM 以兆字节(M)块大小(B)输出文件大小。
  • 2>/dev/null - 排除“权限被拒绝”的错误消息(感谢 @Oli)。

sort 参数:

  • -n 用于按数字排序。
  • -r 用于反向排序(从大到小)。

head 参数:

  • -n 50 仅显示前50个结果。
  • 如果使用较小的数字,可以省略 more

注意:如果要包括您的帐户没有访问权限的目录,请在前面加上 sudo

示例:显示 /var 目录中前10个最大的文件和目录(包括总计)。

cd /var
sudo du -aBM 2>/dev/null | sort -nr | head -n 10
7555M   .
6794M   ./lib
5902M   ./lib/mysql
3987M   ./lib/mysql/my_database_dir
1825M   ./lib/mysql/my_database_dir/a_big_table.ibd
997M    ./lib/mysql/my_database_dir/another_big_table.ibd
657M    ./log
629M    ./log/apache2
587M    ./log/apache2/ssl_access.log
273M    ./cache

2谢谢这个企业解决方案。我只想在运行命令之前加上'cd /'来完成这个任务:'cd /;sudo du -aBM 2>/dev/null | sort -nr | head -n 10 > sizelog.txt' - Eyni Kave

我只是使用了 dusort 的组合。
sudo du -sx /* 2>/dev/null | sort -n

0   /cdrom
0   /initrd.img
0   /lib64
0   /proc
0   /sys
0   /vmlinuz
4   /lost+found
4   /mnt
4   /nonexistent
4   /selinux
8   /export
36  /media
56  /scratchbox
200 /srv
804 /dev
4884    /root
8052    /bin
8600    /tmp
9136    /sbin
11888   /lib32
23100   /etc
66480   /boot
501072  /web
514516  /lib
984492  /opt
3503984 /var
7956192 /usr
74235656    /home

然后就是一个“洗涤和重复”的过程。针对你认为太大的子目录,运行相应的命令,找出问题所在。
注意:我使用“du”命令的“-x”选项,以限制在一个文件系统内(我有一个相当复杂的SSD和RAID5之间的交叉挂载设置)。
注意2:使用“2>/dev/null”将任何错误消息重定向到虚无。如果它们不影响你,这并非强制性要求。

1当我运行这个命令时,du会进入子目录。根据du的帮助页:“对每个文件递归地总结磁盘使用情况。” - Jamie

要在当前文件夹中递归显示前20个最大的目录,可以使用以下一行命令:
du -ah . | sort -rh | head -20

或者(更偏向Unix系统):
du -a . | sort -rn | head -20

对于当前目录(递归地)中最大的20个文件:
ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

或者使用人类可读的大小:
ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

请注意,-h 仅适用于 GNU 的 sort 命令,所以为了在 OSX/BSD 上正常工作,您需要从 coreutils 中安装它。然后将其文件夹添加到您的 PATH 中。
因此,在您的rc文件中添加这些别名是非常有用的(每次需要时):
alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

qbi的回答是正确的,但是当有很多文件时,它会变得非常慢,因为它会为每个项目启动一个新的ls进程。
使用find而不生成子进程的更快版本是使用printf打印以字节为单位的大小(%s)和路径(%p)。 find "$directory" -type f -printf "%s - %p\n" | sort -n | tail -n $num_entries

1确认这个要快得多 - Cookie

在回答类似问题中提到的一个非常好用、用户友好的工具是NCurses Disk Usage工具。
sudo ncdu /

嗯,从文件系统的根目录开始对我来说绝对不是毫无意义的。这使我能够确定整个文件系统中需要节省空间的最重要位置。无论如何,你可以使用提到的工具从任何目录开始。查看该工具的文档吧。但是,根据你的要求,这是源答案的链接 - janoside

这似乎是使用find的完美应用场景:
find $DIRECTORY -type f -exec ls -s {} \; | sort -n | tail -n 5

这个命令会在目录$DIRECTORY中找到所有的文件,并对它们执行ls -s命令。最后一个命令会打印出文件的分配大小和文件名。结果按数字排序,显示最后五个条目。因此,你将看到$DIRETORY或任何子目录中最大的5个文件。如果你输入tail -n 1,你将只看到最大的文件。
此外,你可以通过find进行很多操作。例如,你可以查找比n天更年轻的文件(-ctime -n),或者属于特定用户的文件(-user johndoe)。

当我需要在服务器上释放更多的空间时,我使用这个命令。它会找到所有大于50MB的文件,并且"du -h"会生成更好的文件列表,而"sort -n"则会在管道后按文件大小进行数字排序。
find / -size +50M -type f -exec du -h {} \; | sort -n

试试Baobab吧,它可以给你一个文件和文件夹的图形概览,你可以看到哪些占用了大量空间的文件,并且只需点击一次就可以删除它们。 https://help.ubuntu.com/community/Baobab

2在这个特定的问题中,楼主更喜欢使用命令行方法。请查看问题下的评论。我也会编辑问题。 - user25656
如果你能够使用图形用户界面,这个工具非常棒。 - NeverMine17

要找到所有GB文件,我会使用du和grep命令,尽管这里提到的其他方法也很不错。
du -h -a /dir | grep "[0-9]G\b"  

你还可以使用du的--except选项来进行高级操作。