使用 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 上的圖形檔案瀏覽器中點擊「大小」列標題時得到的結果。
視窗
蘋果
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang適合快速開發和並發場景,C 適用於需要極致性能和低級控制的場景。 1)Golang通過垃圾回收和並發機制提升性能,適合高並發Web服務開發。 2)C 通過手動內存管理和編譯器優化達到極致性能,適用於嵌入式系統開發。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t
