问题描述
寻找一系列能够显示驱动器上最大文件的命令。
最佳解决方案
如果您只需要查找大文件,则可以使用find
和-size
选项。下一个命令将列出大于10MiB的所有文件(not to be confused with 10MB):
find / -size +10M -ls
如果您想查找特定尺寸的文件,可以将它与“尺寸小于”搜索结合起来。下一个命令查找10MiB和12MiB之间的文件:
find / -size +10M -size -12M -ls
apt-cache search 'disk usage'
列出了一些可用于磁盘使用情况分析的程序。一个看起来非常有前景的应用是gt5
。
从包装说明:
Years have passed and disks have become larger and larger, but even on this incredibly huge harddisk era, the space seems to disappear over time. This small and effective programs provides more convenient listing than the default du(1). It displays what has happened since last run and displays dir size and the total percentage. It is possible to navigate and ascend to directories by using cursor-keys with text based browser (links, elinks, lynx etc.)
在gt5的”related packages”部分,我找到了ncdu
。从它的包装描述中:
Ncdu is a ncurses-based du viewer. It provides a fast and easy-to-use interface through famous du utility. It allows to browse through the directories and show percentages of disk usage with ncurses library.
次佳解决方案
我只是使用du
和sort
的组合。
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之间有一个相当复杂的cross-mounted事物安排)。
注2:2>/dev/null
将任何错误消息重定向为遗忘。如果他们不打扰你,这不是强制性的。
第三种解决方案
我最喜欢的解决方案使用了几个这些好的答案。
du -aBM 2>/dev/null | sort -nr | head -n 50 | more
du
参数:
-
-a
用于”all”文件和目录。把它关闭只是为了目录 -
-BM
以兆字节(M)块大小(B)输出大小 -
2>/dev/null
– 排除”permission denied”错误消息(谢谢@Oli)
sort
参数:
-
-n
用于”numeric” -
“reverse”的
-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
第四种方案
qbi的答案是正确的,但是当文件很多时它会很慢,因为它会为每个项目启动一个新的ls过程。
使用find而不产生子进程的更快的版本将是使用printf来以字节(%s)和路径(%p)来打印大小,
find "$directory" -type f -printf "%s - %p\n" | sort -n | tail -n $num_entries
第五种方案
这似乎是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
)的文件。
第六种方案
要显示当前文件夹中最大的前20个目录(递归),请使用以下one-liner:
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
Please note that
-h
is available for GNUsort
only, so to make it work on OSX/BSD properly, you’ve to install it fromcoreutils
. Then add its folder into yourPATH
.
所以这些别名在你的rc文件中是有用的(每当你需要时):
alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'
第七种方案
当我需要在服务器上创建更多的可用空间时,我使用这个命令。它找到所有大于50 MB的文件,“du -h”制作更好的文件列表,并在管道制作列表数字列按文件大小排序后“排序-n”。
find / -size +50M -type f -exec du -h {} \; | sort -n