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

使用 Python、PowerShell、C# 或 Go 按大小降序对目录中的项目进行排序

Patricia Arquette
发布: 2024-11-08 08:34:02
原创
423 人浏览过

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

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

问题

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

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

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

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

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板