搜索
首页后端开发Golang使用 Python、PowerShell、C# 或 Go 按大小降序对目录中的项目进行排序

一个简单的程序,用于按大小降序对目录中的所有项目(无论是文件还是文件夹)进行排序。

无论您使用图形文件浏览器还是命令行,按大小降序对目录中的项目进行排序并不像您想象的那么简单,因为操作系统在浏览目录时不会计算目录内容的总大小树。本文提供了在大多数操作系统上克服此问题的完整工作程序。

问题

也许你会发现以下内容很熟悉:

无论是工作还是个人项目,我喜欢通过创建一个父目录来组织我的数字资产,比如说一个名为“项目”的目录,并在其中存储各个项目的所有内容。如果项目很小并且不涉及很多内容,我将使用单个文件,通常是文本文件。如果一个项目涉及更多内容,比如一个文本文件和几个屏幕截图,我将为该项目创建一个文件夹,并将所有相关资源放在其中。因此,从我的角度来看,单个文本文件和文件夹在各自代表一个项目的意义上是等效的。唯一的区别是该文件夹代表一个更大的项目,一个包含更多内容的项目。

有时候我想看看我的哪个项目目前是最大的,哪个有最多的东西。发生这种情况通常是因为我已经有一段时间没有在某个特定领域工作了,所以当我回来时,我想看看哪个项目内容最多。我的理由是内容最多的项目应该是最完整的,因此可能是我应该首先开始工作的项目,因为它最容易完成。

例如,考虑包含以下内容的目录:

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 上的图形文件浏览器中单击“大小”列标题时得到的结果。

视窗

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Windows 文件资源管理器 - 文件按大小降序排序,文件夹按字母升序显示在下方。

苹果

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

MacOS Finder - 目录内容的排序方式与 Windows 上相同。

Linux

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Linux (Ubuntu) 文件应用程序 - 文件夹和文件排序正确,但单独排序;首先是文件夹,然后是文件。因此,列表中第一个出现的项目实际上并不是目录中最大的项目。

使用命令行提供的输出在某种程度上更接近所需的输出,但仍然不完全正确:

视窗

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'

四种实现之间存在一些细微差别,但四种实现的一般方法是相同的:

  1. 创建一个递归函数,返回项目(文件或文件夹)名称和大小的键值对集合。
  2. 在主函数或块中,进行一些基本的输入验证,如果用户提供了有效路径,则在该路径上运行递归函数。
  3. 按值(大小)对递归函数的输出进行降序排序。
  4. 将排序后的输出打印到控制台。打印的每一行都遵循以下格式:项目名称,后跟制表符,然后是项目大小除以 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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
GO中的字符串操纵:掌握'字符串”软件包GO中的字符串操纵:掌握'字符串”软件包May 14, 2025 am 12:19 AM

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

去'字符串”包装提示和技巧去'字符串”包装提示和技巧May 14, 2025 am 12:18 AM

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

GO中的'字符串”软件包:您的首选字符串操作GO中的'字符串”软件包:您的首选字符串操作May 14, 2025 am 12:17 AM

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

Go Bytes软件包与字符串软件包:我应该使用哪个?Go Bytes软件包与字符串软件包:我应该使用哪个?May 14, 2025 am 12:12 AM

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

如何使用'字符串”软件包逐步操纵字符串如何使用'字符串”软件包逐步操纵字符串May 13, 2025 am 12:12 AM

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软件包:如何改进我的代码?Go Strings软件包:如何改进我的代码?May 13, 2025 am 12:10 AM

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

GO BYTES软件包中最有用的功能是什么?GO BYTES软件包中最有用的功能是什么?May 13, 2025 am 12:09 AM

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

使用GO的'编码/二进制”软件包掌握二进制数据处理:综合指南使用GO的'编码/二进制”软件包掌握二进制数据处理:综合指南May 13, 2025 am 12:07 AM

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

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热门文章

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

螳螂BT

螳螂BT

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

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器