首頁 > 後端開發 > Golang > 主體

使用 Python、PowerShell、C# 或 Go 依大小降序對目錄中的項目進行排序

Patricia Arquette
發布: 2024-11-08 08:34:02
原創
333 人瀏覽過

一個簡單的程序,用於按大小降序對目錄中的所有項目(無論是檔案還是資料夾)進行排序。

無論您使用圖形檔案瀏覽器還是命令列,按大小降序對目錄中的項目進行排序並不像您想像的那麼簡單,因為作業系統在瀏覽目錄時不會計算目錄內容的總大小樹。本文提供了在大多數作業系統上克服此問題的完整工作程序。

問題

也許你會發現以下內容很熟悉:

無論是工作還是個人項目,我喜歡透過建立一個父目錄來組織我的數位資產,比如說一個名為「專​​案」的目錄,並在其中儲存各個項目的所有內容。如果項目很小並且不涉及很多內容,我將使用單一文件,通常是文字文件。如果一個專案涉及更多內容,例如一個文字檔案和幾個螢幕截圖,我將為該專案建立一個資料夾,並將所有相關資源放在其中。因此,從我的角度來看,單一文字檔案和資料夾在各自代表一個專案的意義上是等效的。唯一的區別是該資料夾代表一個更大的項目,一個包含更多內容的項目。

有時候我想看看我的哪個項目目前是最大的,哪個有最多的東西。發生這種情況通常是因為我已經有一段時間沒有在某個特定領域工作了,所以當我回來時,我想看看哪個項目內容最多。我的理由是內容最多的項目應該是最完整的,因此可能是我應該先開始工作的項目,因為它最容易完成。

例如,考慮包含以下內容的目錄:

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!