Bash - 列出并按名称和大小排序文件及其大小

6
我正在尝试弄清如何按名称和大小对文件列表进行排序。 请问如何使用“du -a”按文件名和大小排序,同时不显示目录? 使用“du -a”命令。
1   ./locatedFiles
0   ./testDir/j.smith.c
0   ./testDir/j.smith
1   ./testDir/sampleFunc/arrays
2   ./testDir/sampleFunc
0   ./testDir/j.smith.txt
0   ./testDir/testing
0   ./testDir/test2
0   ./testDir/test3
0   ./testDir/test1
0   ./testDir/first/j.smith
0   ./testDir/first/test
1   ./testDir/first
1   ./testDir/second
1   ./testDir/third
6   ./testDir

如何列出所有没有目录的文件, 添加文件大小,并按文件名称首先排序,然后按大小排序?
感谢您的帮助。

你想按文件名排序还是路径? - thekbb
4个回答

19
你可以使用这个:
find -type f -printf "%f  %s %p\n"|sort

解释:

  • -type f 用于查找文件
  • -printf 用于以特定格式打印输出:
    • %f 用于打印文件名
    • %s 用于打印文件大小
    • %p 用于打印完整的文件名(即包含前缀路径)- 如果你不想要可以省略

然后通过 sort 命令按照上述顺序排序(即文件名,然后是文件大小,最后是文件路径)。输出结果大致如下(仅展示部分输出内容):

...
XKBstr.h 18278 ./extensions/XKBstr.h
XlibConf.h 1567 ./XlibConf.h
Xlib.h 99600 ./Xlib.h
Xlibint.h 38897 ./Xlibint.h
Xlocale.h 1643 ./Xlocale.h
xlogo11 219 ./bitmaps/xlogo11
....
希望这可以帮助到你。

9
你可以使用 sort 命令。
$ find -type f -printf $'%s\t%f\n' | sort -k2,2 -k1,1n

按照第二个字段(名称)排序,然后按照第一个字段(大小)进行数字排序。

请注意,这些“sort”选项(mutatis mutandis)也适用于“-printf”方法。您可能还想使用“cut”或类似工具删除字段。 - torek
你可以在使用“du”命令时添加参数“--max-depth=1”来仅显示当前目录的大小,但它仍然会列出子目录而不是其内容。 - lmcanavals

1

正如其他答案所说,这并不是一个真正的bash问题。

du几乎坚持要告诉你关于目录的信息:如果你将它指向一个目录,那么无论是否使用-a,它都会告诉你有关它的信息。

然而,如果你有GNU du,你可以告诉它从stdin读取一个NUL终止的文件名列表,因此你可以使用find来生成列表:find ... -print0 | du --files0-from=-(这里不需要-a标志)。 (如果你没有--files0-from选项,你仍然可以使用xargs相对高效地调用du;请参阅xargs文档。)

如果你有GNU du,你可能有GNU find,它具有@icyrock.com描述的-printf。只需使用它。然后使用显式的sort


0
$ stat --printf='%s %n\n' * | sort -k2,2 -k1n

使用stat获取文件大小(%s)和名称(%n),并将其通过管道传递给sort,按名称和大小顺序进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接