一个简单的程序,用于按大小降序对目录中的所有项目(无论是文件还是文件夹)进行排序。
无论您使用图形文件浏览器还是命令行,按大小降序对目录中的项目进行排序并不像您想象的那么简单,因为操作系统在浏览目录时不会计算目录内容的总大小树。本文提供了在大多数操作系统上克服此问题的完整工作程序。
问题
也许你会发现以下内容很熟悉:
无论是工作还是个人项目,我喜欢通过创建一个父目录来组织我的数字资产,比如说一个名为“项目”的目录,并在其中存储各个项目的所有内容。如果项目很小并且不涉及很多内容,我将使用单个文件,通常是文本文件。如果一个项目涉及更多内容,比如一个文本文件和几个屏幕截图,我将为该项目创建一个文件夹,并将所有相关资源放在其中。因此,从我的角度来看,单个文本文件和文件夹在各自代表一个项目的意义上是等效的。唯一的区别是该文件夹代表一个更大的项目,一个包含更多内容的项目。
有时候我想看看我的哪个项目目前是最大的,哪个有最多的东西。发生这种情况通常是因为我已经有一段时间没有在某个特定领域工作了,所以当我回来时,我想看看哪个项目内容最多。我的理由是内容最多的项目应该是最完整的,因此可能是我应该首先开始工作的项目,因为它最容易完成。
例如,考虑包含以下内容的目录:
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 上的图形文件浏览器中单击“大小”列标题时得到的结果。
视窗
苹果
Linux
使用命令行提供的输出在某种程度上更接近所需的输出,但仍然不完全正确:
视窗
dir /b /o:-d
输出:
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
Mac 和 Linux
在基于 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
在 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。
解决方案
肯定有至少十几个免费工具可以解决这个问题,但说实话,我什至没有看。编写一个执行相同操作的脚本/程序,然后在这里分享,感觉会更容易,涉及更少的臃肿,希望对其他人有用,而且肯定更有趣。
我已经胡言乱语太久了。代码如下:
Python
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
C夏普
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'
四种实现之间存在一些细微差别,但四种实现的一般方法是相同的:
- 创建一个递归函数,返回项目(文件或文件夹)名称和大小的键值对集合。
- 在主函数或块中,进行一些基本的输入验证,如果用户提供了有效路径,则在该路径上运行递归函数。
- 按值(大小)对递归函数的输出进行降序排序。
- 将排序后的输出打印到控制台。打印的每一行都遵循以下格式:项目名称,后跟制表符,然后是项目大小除以 1024 并四舍五入到两位小数以获得以千字节为单位的大小,后跟“KB”表示大小单位。
用法
在命令行上,将要排序的目录的路径作为第一个参数传递。我不会列出所有可能的示例,但这里有几个,假设您已复制代码并将其保存为文件名 dir_desc(“目录降序”的缩写),加上适当的文件扩展名:
在 Mac 或 Linux 上使用 Python:
python3 dir_desc.py
在 Windows 上使用 PowerShell:
powershell -f dir_desc.ps1
语言和实现之间的差异
- Python 和 Go 类似于 C 和其他类 C 语言,因为第一个命令行参数是 args 数组中的第二项。在 .NET 语言、PowerShell 和 C# 中,第一个参数是 args 数组中的第一项。
- 在 PowerShell 中,无需创建单独的递归函数,因为使用内置的 Get-ChildItem (gci) 和 Measure-Object (measure) cmdlet 可以更轻松地实现所需的结果。
- 在 Go 中,按值对键值对(映射)集合进行排序需要比其他语言多几行代码,因为内置排序函数设计用于处理数组/切片,而不是映射。
- 在 Go 中,在打印输出时,使用 fmt.Printf() 函数将浮点数舍入到 X 个小数位,而不是在对数字进行舍入时处理,顺便说一句,这可以在不使用数学的情况下完成.Round() 函数。如果您有 C 背景,这可能很直观。对于我们其他人来说,这有点奇怪,但效果很好。
我将 Python 中的原始方法移植到了其他几种语言,以便至少有一个版本可以在三个主要操作系统中的每一个上运行:
- Mac 和 Linux:默认安装 python3 解释器。如果没有,您可以使用 Go 版本。某些 Linux 系统可能默认安装了可以编译 Go 的 gcc 版本,但大多数系统不会,因此您需要下载 Go 编译器。
- Windows:PowerShell 版本应该可以在 Windows 10 或更高版本的系统上开箱即用。对于较旧的系统,C# 版本可能是更好的选择。您可以使用Windows内置的C#编译器来编译代码。
就是这样。另一头牦牛,剃毛。我希望您觉得这很有用。
以上是使用 Python、PowerShell、C# 或 Go 按大小降序对目录中的项目进行排序的详细内容。更多信息请关注PHP中文网其他相关文章!

掌握Go语言中的strings包可以提高文本处理能力和开发效率。1)使用Contains函数检查子字符串,2)用Index函数查找子字符串位置,3)Join函数高效拼接字符串切片,4)Replace函数替换子字符串。注意避免常见错误,如未检查空字符串和大字符串操作性能问题。

你应该关心Go语言中的strings包,因为它能简化字符串操作,使代码更清晰高效。1)使用strings.Join高效拼接字符串;2)用strings.Fields按空白符分割字符串;3)通过strings.Index和strings.LastIndex查找子串位置;4)用strings.ReplaceAll进行字符串替换;5)利用strings.Builder进行高效字符串拼接;6)始终验证输入以避免意外结果。

thestringspackageingoisesential forefficientstringManipulation.1)itoffersSimpleyetpoperfulfunctionsFortaskSlikeCheckingSslingSubstringsStringStringsStringsandStringsN.2)ithandhishiCodeDewell,withFunctionsLikestrings.fieldsfieldsfieldsfordsforeflikester.fieldsfordsforwhitespace-fieldsforwhitespace-separatedvalues.3)3)

WhendecidingbetweenGo'sbytespackageandstringspackage,usebytes.Bufferforbinarydataandstrings.Builderforstringoperations.1)Usebytes.Bufferforworkingwithbyteslices,binarydata,appendingdifferentdatatypes,andwritingtoio.Writer.2)Usestrings.Builderforstrin

Go的strings包提供了多种字符串操作功能。1)使用strings.Contains检查子字符串。2)用strings.Split将字符串分割成子字符串切片。3)通过strings.Join合并字符串。4)用strings.TrimSpace或strings.Trim去除字符串首尾的空白或指定字符。5)用strings.ReplaceAll替换所有指定子字符串。6)使用strings.HasPrefix或strings.HasSuffix检查字符串的前缀或后缀。

使用Go语言的strings包可以提升代码质量。1)使用strings.Join()优雅地连接字符串数组,避免性能开销。2)结合strings.Split()和strings.Contains()处理文本,注意大小写敏感问题。3)避免滥用strings.Replace(),考虑使用正则表达式进行大量替换。4)使用strings.Builder提高频繁拼接字符串的性能。

Go的bytes包提供了多种实用的函数来处理字节切片。1.bytes.Contains用于检查字节切片是否包含特定序列。2.bytes.Split用于将字节切片分割成smallerpieces。3.bytes.Join用于将多个字节切片连接成一个。4.bytes.TrimSpace用于去除字节切片的前后空白。5.bytes.Equal用于比较两个字节切片是否相等。6.bytes.Index用于查找子切片在largerslice中的起始索引。

theEncoding/binarypackageingoisesenebecapeitProvidesAstandArdArdArdArdArdArdArdArdAndWriteBinaryData,确保Cross-cross-platformCompatibilitiational and handhandlingdifferentendenness.itoffersfunctionslikeread,写下,写,dearte,readuvarint,andwriteuvarint,andWriteuvarIntforPreciseControloverBinary


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

禅工作室 13.0.1
功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器