介绍
使用命令查找大小第二大的文件/目录。
我拥有的
du /etc/ -hsx * | sort -rh | head -2
该命令向我显示了两行,根据我选择的选项,它们为我提供了 /etc/ 中的 2 个最大的文件/目录。
问题
如果我只想查找第二大文件怎么办?我该怎么做?
例如,通过执行命令sudo du /etc/ -hsx * | sort -rh | head -2 | tail -1
我得到结果
1.5M卡扣
但我期望的是只得到它的名称,而不是大小或其他。只是名字。我还读到也可以使用命令来完成ls
。
答案1
如果我只想查找第二大文件怎么办?我该怎么做?
强制 zsh 选项:
zsh -c 'print -r /etc/**/*(DoL[-2])'
这会调用 zsh 并要求它打印参数,即:
- 递归文件名扩展
**/*
o
按大小(ength)排序( ordered)L
,大小递增D
启用dotglob
该 glob,因此还考虑隐藏文件或隐藏目录中的文件。- 仅限于列表中倒数第二个条目 (
[-2]
)
答案2
假设通过尺寸,您的意思是非目录文件的磁盘使用量或通过目录文件引用的所有文件的累积磁盘使用量(如您的用法du
所示),使用 GNU 实用程序,您可以执行以下操作:
sudo LC_ALL=C du -al0d1 /etc |
sort -zrn |
tail -zn+2 |
head -zn1 |
cut -zf2- |
tr '\0' '\n'
+ tail
+head
也cut
可以替换为sed -z $'1d;s/^[^\t]*\t//;q'
.
笔记:
- with
du /etc/ -hsx *
(假设 GNUfind
并且POSIXLY_CORRECT
不在您使用选项的环境中后非选项参数),您将获得/etc
该文件中所有非隐藏文件的磁盘使用情况当前的目录。 - 使用
-a
and (GNU 扩展)解决了排除隐藏目录或达到参数数量限制的-d1
所有问题。*
-h
不仅不可移植,而且还会损失很多精度(因此很可能会让您报告错误的文件),并且使sort
工作变得更加困难,因此会适得其反。- 如果没有
-l
(GNU 扩展),硬链接仅计算一次,因此如果some-large-file
同时发现 和/etc/dir1/some-large-file
,则/etc/dir2/other-link-to-some-large-file
所占用的磁盘空间some-large-file
仅占这些目录之一du
。 - 换行符与文件名中的任何字符一样有效(macOS 实际上曾经在
/etc
IIRC 中提供带有换行符的文件名)。因此,通常您不能使用基于行的文本处理来处理这些问题。大多数 GNU 实用程序都具有-z
或-0
可以选择使用 NUL 分隔记录。 - 请注意,在该排序列表中,第一个记录将是
/etc
。因此,通过获取第二条记录,我们实际上报告的是 中最重的文件/目录/etc
,而不是第二重的文件/目录。 sort
如果存在平局,则将通过without完成的最后比较比较来选择区域设置排序顺序中最后排序的文件名-s
。
答案3
可能的选择之一是sort
再次使用翻转结果并使用head -1
?喜欢:
du /etc/ -hsx * | sort -rh | head -2 | sort -r | head -1
答案4
和sed,只需添加:
| sed -n 2p
不需要做额外的事情头。
完整命令:
du /etc/ -hsx * | sort -rh | sed -n 2p
如果你想坚持使用头排序后,然后添加这个尾巴:
| tail +2
完整命令:
du /etc/ -hsx * | sort -rh | head -2 | tail +2