在 Unix 服务器上查找文件并按大小排序

在 Unix 服务器上查找文件并按大小排序

我有一个网络服务器,但空间不足,导致出现问题WordPress我在上面运行的网站。

我知道我有很多大的 .png 文件(事实上它是巴布亚新几内亚本身就是一个错误,但我们不要深究)。

我想获取 PNG 或的列表JPEG服务器上的文件并按大小递减对它们进行排序。我知道我可以使用ls -SlahR,但排序是基于每个文件夹的。

然后我想出了find . -name "*.png" | xargs -i -n1 ls -lah {}哪个是可以的,除了(a)它不会对行进行排序,(b)它显示了我不太关心的文件权限和所有权。

那么还有更好的吗?会产生 [size] [path_to_file] 的东西?

答案1

find你可以用 (GNU)和来完成整个事情sort,不需要du

$ find . -iname '*png' -printf '%s %p\n' | sort -rn
68109 ./7.png
21751 ./2.png
21751 ./1.png
5393 ./6.png
2542 ./5.png
1717 ./4.png
1003 ./3.png
878 ./10.png
793 ./9.png
587 ./8.png

答案2

find您可以使用,du和的组合,sort如下所示:

find <directory> -iname "*.png" -type f -print0 | xargs -0 -n1 du -b | sort -n -r

这将搜索所有以(不区分大小写)<directory>结尾的常规文件。.png然后将结果传递给对每个单个文件xargs进行调用du,获取其大小(以字节为单位)(由于-b)并传递给sort,后者对结果进行数字排序(-n,后者按文件大小降序-r( )。使用代替 来-print0分隔结果,因此您可以拥有包含奇怪字符(例如空格和换行符)的路径。\0\n

答案3

如果您需要最兼容的版本,您可以使用常规查找和排序来完成(不依赖 gnu 扩展,例如 printf):

find . -ls | grep -i -e '\.png$' -e '\.jpe*g' | sort -k7,7nr

-k7,7:对列进行排序7 to 7(即,只有 7)(...这应该是一个参数,允许用户更改列号,以防在旧系统上 find -ls 输出大小(以字节为单位)在不同的列上)

相关内容