一个简单的程序,用于按大小降序对目录中的所有项目(无论是文件还是文件夹)进行排序。
无论您使用图形文件浏览器还是命令行,按大小降序对目录中的项目进行排序并不像您想象的那么简单,因为操作系统在浏览目录时不会计算目录内容的总大小树。本文提供了在大多数操作系统上克服此问题的完整工作程序。
也许你会发现以下内容很熟悉:
无论是工作还是个人项目,我喜欢通过创建一个父目录来组织我的数字资产,比如说一个名为“项目”的目录,并在其中存储各个项目的所有内容。如果项目很小并且不涉及很多内容,我将使用单个文件,通常是文本文件。如果一个项目涉及更多内容,比如一个文本文件和几个屏幕截图,我将为该项目创建一个文件夹,并将所有相关资源放在其中。因此,从我的角度来看,单个文本文件和文件夹在各自代表一个项目的意义上是等效的。唯一的区别是该文件夹代表一个更大的项目,一个包含更多内容的项目。
有时候我想看看我的哪个项目目前是最大的,哪个有最多的东西。发生这种情况通常是因为我已经有一段时间没有在某个特定领域工作了,所以当我回来时,我想看看哪个项目内容最多。我的理由是内容最多的项目应该是最完整的,因此可能是我应该首先开始工作的项目,因为它最容易完成。
例如,考虑包含以下内容的目录:
Name | Type | Size |
---|---|---|
Huge Project.txt | File | 2.6KB |
Larger Project | Folder | 1.07KB |
0 - Tiny Project | Folder | 0KB |
Basic Project.txt | File | 0.36KB |
Big Project.txt | File | 2.11KB |
按大小降序对上述目录进行排序应输出:
Huge Project.txt 2.6KB Big Project.txt 2.11KB Larger Project 1.07KB Basic Project.txt 0.36KB 0 - Tiny Project 0KB
但是,这并不是我们在 Windows、Mac 和 Linux 上的图形文件浏览器中单击“大小”列标题时得到的结果。
使用命令行提供的输出在某种程度上更接近所需的输出,但仍然不完全正确:
dir /b /o:-d
输出:
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
在基于 UNIX 的系统(例如 Mac 和 Linux)上有多种用于目录内容排序的命令组合。大多数涉及使用 du、sort 和 ls。我在网上找到的其他示例也将 find 和 grep 混合在一起。
这是我尝试过的:
du -a -h --max-深度=1 |排序-hr
输出:
32K . 8.0K ./Larger Project 8.0K ./0 - Tiny Project 4.0K ./Huge Project.txt 4.0K ./Big Project.txt 4.0K ./Basic Project.txt
在 ls 命令上使用 -S 开关应该可以完全满足我的要求,按大小降序对项目进行排序。
ls -S
输出:
'0 - Tiny Project' 'Larger Project' 'Huge Project.txt' 'A - Big Project.txt' 'Basic Project.txt'
输出仍然关闭。我尝试添加 -l(长)开关。
ls -lS
输出:
total 20 drwx---r-x 2 admin admin 4096 Sep 20 21:49 '0 - Tiny Project' drwx---r-x 2 admin admin 4096 Sep 20 21:49 'Larger Project' -rw-rw-r-- 1 admin admin 2667 Sep 20 21:49 'Huge Project.txt' -rw-rw-r-- 1 admin admin 2164 Sep 20 21:49 'Big Project.txt' -rw-rw-r-- 1 admin admin 368 Sep 20 21:49 'Basic Project.txt'
输出包含更多详细信息,如预期,但排序顺序与之前相同。
虽然各种命令的输出没有提供所需的输出,但它确实突出了问题的根本原因。浏览目录树时,操作系统不会递归到文件夹来计算其内容的总大小。相反,他们将所有文件夹视为具有相同的固定大小。通常这是文件系统的最小块大小,通常为 4096 字节,4KB。
肯定有至少十几个免费工具可以解决这个问题,但说实话,我什至没有看。编写一个执行相同操作的脚本/程序,然后在这里分享,感觉会更容易,涉及更少的臃肿,希望对其他人有用,而且肯定更有趣。
我已经胡言乱语太久了。代码如下:
Huge Project.txt 2.6KB Big Project.txt 2.11KB Larger Project 1.07KB Basic Project.txt 0.36KB 0 - Tiny Project 0KB
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
32K . 8.0K ./Larger Project 8.0K ./0 - Tiny Project 4.0K ./Huge Project.txt 4.0K ./Big Project.txt 4.0K ./Basic Project.txt
'0 - Tiny Project' 'Larger Project' 'Huge Project.txt' 'A - Big Project.txt' 'Basic Project.txt'
四种实现之间存在一些细微差别,但四种实现的一般方法是相同的:
在命令行上,将要排序的目录的路径作为第一个参数传递。我不会列出所有可能的示例,但这里有几个,假设您已复制代码并将其保存为文件名 dir_desc(“目录降序”的缩写),加上适当的文件扩展名:
在 Mac 或 Linux 上使用 Python:
python3 dir_desc.py
在 Windows 上使用 PowerShell:
powershell -f dir_desc.ps1
我将 Python 中的原始方法移植到了其他几种语言,以便至少有一个版本可以在三个主要操作系统中的每一个上运行:
就是这样。另一头牦牛,剃毛。我希望您觉得这很有用。
以上是使用 Python、PowerShell、C# 或 Go 按大小降序对目录中的项目进行排序的详细内容。更多信息请关注PHP中文网其他相关文章!