为什么我不能使用 find + awk 来查找文件系统中最大的文件?

为什么我不能使用 find + awk 来查找文件系统中最大的文件?

为什么这不起作用?
find / -ls 2>/dev/null | awk '$7 > max {max = $7}; END {print max}'
这确实有效:
find / -printf "%s\n" 2>/dev/null | sort -nr |head -n1

在第一个中,$7 是文件的大小,所以我不知道为什么它不起作用

答案1

您不会在输出中获得第七个字段的大小:find / -ls

  • 对于设备文件,您可以在其中获取设备主编号
  • 如果用户名或组名包含空白字符
  • 如果文件路径(包括符号链接的目标)具有换行符。

另请注意,其中一些文件可能是虚拟的。比如/proc/kcore我的系统上有128TiB大,系统的虚拟内存地址空间。

此外,表观大小与磁盘使用情况不同。truncate -s15T file例如,创建一个 15TiB 稀疏文件,不占用磁盘空间。%b如果您想找出占用磁盘空间最多的文件,请使用此选项。

请注意,如果存在联系,您将获得的联系也会因这些方法而异。

find / -xdev -printf '%b %p\0' 2> /dev/null |
  sort -zk1rn | head -zn1 | tr '\0' '\n'

(最重且 if 按词汇顺序排列在前)

或者:

find / -xdev -printf '%b %p\0' 2> /dev/null|
  awk -v max=-1 -v RS='\0' '
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

(最重,如果平局则随机)。

磁盘使用情况以 512 字节单位的数量表示。请注意,您没有读取或搜索权限的目录中的文件将不会被考虑。

-xdev将搜索限制为一个文件系统,此处为根文件系统。

请注意-printf-z是 GNU 扩展。-v RS='\0'也是非标准的。

报告所有联系(排名不分先后):

find / -xdev -printf '%b %p\0' 2> /dev/null |
  awk -v max=-1 -v RS='\0' '
    $1 == max {out = out ORS $0; next}
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

答案2

奇怪的。不过我得到了这个工作:

sudo find /boot -ls | awk '$7 > max {name = $11 ; max = $7}; END {print name" "max}'

相关内容