按BASH中的文件大小顺序列出文件名

时间:2016-12-24 20:26:28

标签: bash

所以,我正在尝试对很多文件执行批处理,但我希望批处理首先从最小的文件开始。我需要做的是按升序获取所有文件名,按文件大小排序。我看过一些例子,但有一个问题是有些文件名包含空格,连字符,下划线和其他特殊字符,所以找不到对我有用的东西。

3 个答案:

答案 0 :(得分:6)

ls -rS会做到这一点。手册页解释了更多:http://man7.org/linux/man-pages/man1/ls.1.html

答案 1 :(得分:1)

<强> find . -type f -print0 | xargs -0 wc -c | sort -n

上面的示例按大小的升序列出当前目录下的文件。 find命令的-print0参数指示它使用null '\0'字符而不是空格作为搜索结果之间的分隔符。在管道的另一端,-0参数准备xargs命令执行相同的操作。这将把文件名中的空白字符作为普通字符处理。

答案 2 :(得分:1)

如果:

  • 您并不担心嵌入换行符的文件名
  • 您不需要实际的文件大小,只需要按基础文件大小排序的文件名,

然后K. Matthews' answer应该适合你。

否则,假设您有 GNU 实用程序:

find . -mindepth 1 -maxdepth 1 -type f -printf '%s\t%f\0' | 
  sort -zn -k1,1 |
    while read -r -d '' size name; do echo "[$size] [$name]"; done

-mindepth 1 -maxdepth 1限制匹配直接位于.的文件,类似于ls(尽管始终包含隐藏文件)。省略整个子树中的处理文件。

while循环显示了一种进一步处理find -printf '...\0' sort -zawk -F'\t' -v RS='\0' ...生成的NUL终止输出的方法。
使用find是另一个。

请注意-printf sort-z&#39; s '\0'是非标准的GNU特定扩展,使用{{1} {}为RSawk