一個簡單的程序,用於按大小降序對目錄中的所有項目(無論是檔案還是資料夾)進行排序。
無論您使用圖形檔案瀏覽器還是命令列,按大小降序對目錄中的項目進行排序並不像您想像的那麼簡單,因為作業系統在瀏覽目錄時不會計算目錄內容的總大小樹。本文提供了在大多數作業系統上克服此問題的完整工作程序。
問題
也許你會發現以下內容很熟悉:
無論是工作還是個人項目,我喜歡透過建立一個父目錄來組織我的數位資產,比如說一個名為「專案」的目錄,並在其中儲存各個項目的所有內容。如果項目很小並且不涉及很多內容,我將使用單一文件,通常是文字文件。如果一個專案涉及更多內容,例如一個文字檔案和幾個螢幕截圖,我將為該專案建立一個資料夾,並將所有相關資源放在其中。因此,從我的角度來看,單一文字檔案和資料夾在各自代表一個專案的意義上是等效的。唯一的區別是該資料夾代表一個更大的項目,一個包含更多內容的項目。
有時候我想看看我的哪個項目目前是最大的,哪個有最多的東西。發生這種情況通常是因為我已經有一段時間沒有在某個特定領域工作了,所以當我回來時,我想看看哪個項目內容最多。我的理由是內容最多的項目應該是最完整的,因此可能是我應該先開始工作的項目,因為它最容易完成。
例如,考慮包含以下內容的目錄:
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
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。