![使用 find 命令按大小列出前 5 个图像文件](https://linux22.com/image/1310450/%E4%BD%BF%E7%94%A8%20find%20%E5%91%BD%E4%BB%A4%E6%8C%89%E5%A4%A7%E5%B0%8F%E5%88%97%E5%87%BA%E5%89%8D%205%20%E4%B8%AA%E5%9B%BE%E5%83%8F%E6%96%87%E4%BB%B6.png)
大家好,
我想列出给定文件夹中的前 5 个图像文件 (png、jpg)。最好的方法是什么?我目前正在使用以下方法,但它没有给出正确的输出:
find . \( -iname \*.png -o -iname \*.jpg \) -exec ls -lrhS {} \; | sort -n | head -5 | awk '{print $9, "=>",$5}'
当我不吹管的时候头命令,我发现输出排序不正确。我该如何实现
答案1
如果“前 5 名”是指按大小排序,那么您需要说明sort
按哪一列排序;默认将按顺序浏览所有列,这意味着它将首先按链接数排序。此外,如果没有某种扩展,“人类可读”的大小根本无法正常排序,除非在 GNU 中sort
;可移植性sort -n
不知道诸如、等后缀B
。K
还请注意,您会丢失您要求的排序信息,ls
因为它是在受控制的单个文件上运行的find
。然后sort
从最低到最高排序,因此即使修复了这一点,您也会得到五个最小的图片来自。(之前head
的 是拼写错误吗?您说只有当管道失败时才运行。)||
awk
awk
find
结合所有这些,通过使用xargs
批处理和组合head
进行优化awk
,你想要的是确保你有 GNU sort
,然后使用
find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -lh | sort -k5gr,5 | awk 'NR <= 5 {print $9, "=>", $5}'
答案2
find . \( -iname "*.png" -o -iname "*.jpg" \) -printf "%k\t%p\n" | sort -rn | head -5
- 根据您的要求在当前目录中使用查找(我假设您的意思是“当前目录和子目录,否则添加
-maxdepth 1
)。 - 打印大小(以 1K 块为单位),然后是制表符,然后是文件名。
- 按数字反向排序。
- 选出前五行。
瞧!
(可能的警告是文件名包含换行符,但实际上我从未见过这些。需要进行一些简单的修改才能解决这个问题)
答案3
感谢大家为我指明了正确的方向。我认为我可以使用以下方法使其工作:
find . \( -iname \*.png -o -iname \*.jpg \) -print0 | xargs -0 ls -l | sort -k5 -r | head -5
我将处理此输出以获取所需格式的输出(即带有 B、K 等后缀)
答案4
非常简单明了:
find . -ls | sort -nk7 | tail -5