2016-12-24 62 views
1

因此,我试图对大量文件执行批处理,但我希望批处理先从最小的文件开始。我需要做的是按升序获取所有文件名,按文件大小排序。我见过一些例子,但一个问题是一些文件名包含空格,连字符,下划线和其他特殊字符,所以我找不到任何适合我的东西。在BASH中按文件大小顺序列出文件名

回答

6

ls -rS会做的伎俩。该名男子页详细解释:http://man7.org/linux/man-pages/man1/ls.1.html

+1

这将不会处理它们之间存在空间的文件,正如问题所示。 – Inian

+3

@Inian为什么不呢? 'ls'将用空格处理文件,回车完美;我看到的* only *问题在于,OP打算将这个输出用作脚本的输入 - 但是您的答案并不能为此提供解决方案。 –

0

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

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

+0

'发现。 -type f -exec wc -c {} + | sort -n'是一个更符合POSIX标准的更高效的替代方案('-print0'不是)。但是,问题在于'wc'具有多于1个文件名参数,以' total'形式打印汇总行,您需要将其过滤掉。请注意,对于大量的输入文件'wc'可能会被多次调用(如果不是所有的文件名都适用于单个命令行),这使得对汇总行进行过滤变得更加棘手,尤其是因为可能存在名为'total'的_files_。 – mklement0

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 -z产生的NUL封端的输出的一种方法。
使用awk -F'\t' -v RS='\0' ...是另一种。

注意find-printfsort-z是非标准的,GNU的特定扩展,如使用'\0'作为RS值与awk