以下 shell 脚本如何查找所有大于 20MB 的文件?

0 awk shell-script

我遇到了一个帖子,建议以下内容将找到大小大于 20Mb 的所有文件。

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但我不明白在 '+20000k' 之后它在做什么。

jim*_*mij 6

find / -type f -size +20000k -exec ls -lh {} \; 2> /dev/null   | awk '{ print $NF ": " $5 }'  | sort -hrk 2,2
Run Code Online (Sandbox Code Playgroud)
  • /: find 从主目录开始
  • -type f: 只查找常规文件
  • -size +20000k: 大小为 20000k 或更大
  • -exec ls -lh {} \;:对于找到的每个文件执行ls -lh,即以长格式和人类可读的大小列出它们(带有后缀“K”、“M”、“G”等)
  • 2>/dev/null: 如果find生成任何错误消息,将它们重定向到黑洞
  • |:将find结果通过管道传递给下一个命令(在本例中为 awk)
  • awk '{print $NF ": " $5}': 打印最后一个字段(ls -lh输出的),然后是冒号,然后是第五个字段。最后一个字段是文件名,第五个字段是文件的大小(前面提到的人类可读格式)。
  • |: 再次管道结果(这次从awkto sort
  • sort -hrk 2,2:仅考虑第二个字段,按相反顺序按人类可读数字对结果进行排序。

笔记

无需awksort命令,您可以更简单、更快地完成此任务:

find / -type f -size +20000k -exec ls -Shs {} +
Run Code Online (Sandbox Code Playgroud)

在哪里

  • ls -Shs: 列出文件,以人类可读的格式打印它们的大小,同时按大小对它们进行排序
  • {} +将找到的文件添加find到列表中,并仅在最后ls对整个列表执行。在{} \;情况下,ls对每个文件单独运行。

这两个命令之间的唯一区别是前者大小写在第二列,而后者在第一列。但是,如果文件或目录的名称中有空格,则输出的ls -l每个文件的列数不同,因此输出awk将或多或少是随机的。换句话说,您不应该解析 ls 的输出