一個簡單的程序,用於按大小降序對目錄中的所有項目(無論是檔案還是資料夾)進行排序。
無論您使用圖形檔案瀏覽器還是命令列,按大小降序對目錄中的項目進行排序並不像您想像的那麼簡單,因為作業系統在瀏覽目錄時不會計算目錄內容的總大小樹。本文提供了在大多數作業系統上克服此問題的完整工作程序。
也許你會發現以下內容很熟悉:
無論是工作還是個人項目,我喜歡透過建立一個父目錄來組織我的數位資產,比如說一個名為「專案」的目錄,並在其中儲存各個項目的所有內容。如果項目很小並且不涉及很多內容,我將使用單一文件,通常是文字文件。如果一個專案涉及更多內容,例如一個文字檔案和幾個螢幕截圖,我將為該專案建立一個資料夾,並將所有相關資源放在其中。因此,從我的角度來看,單一文字檔案和資料夾在各自代表一個專案的意義上是等效的。唯一的區別是該資料夾代表一個更大的項目,一個包含更多內容的項目。
有時候我想看看我的哪個項目目前是最大的,哪個有最多的東西。發生這種情況通常是因為我已經有一段時間沒有在某個特定領域工作了,所以當我回來時,我想看看哪個項目內容最多。我的理由是內容最多的項目應該是最完整的,因此可能是我應該先開始工作的項目,因為它最容易完成。
例如,考慮包含以下內容的目錄:
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 上的圖形檔案瀏覽器中點擊「大小」列標題時得到的結果。
使用命令列提供的輸出在某種程度上更接近所需的輸出,但仍然不完全正確:
dir /b /o:-d
輸出:
Larger Project 0 - Tiny Project Huge Project.txt Big Project.txt Basic Project.txt
在基於 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 指令上使用 -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。
肯定有至少十幾個免費工具可以解決這個問題,但說實話,我什至沒有看。編寫一個執行相同操作的腳本/程序,然後在這裡分享,感覺會更容易,涉及更少的臃腫,希望對其他人有用,而且肯定更有趣。
我已經胡言亂語太久了。程式碼如下:
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
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'
四種實作之間存在一些細微差別,但四種實作的一般方法是相同的:
在命令列上,將要排序的目錄的路徑作為第一個參數傳遞。我不會列出所有可能的範例,但這裡有幾個,假設您已複製程式碼並將其儲存為檔案名稱 dir_desc(「目錄降序」的縮寫),加上適當的檔案副檔名:
Mac 或 Linux 上使用 Python:
python3 dir_desc.py
在 Windows 上使用 PowerShell:
powershell -f dir_desc.ps1
我將 Python 中的原始方法移植到了其他幾種語言,以便至少有一個版本可以在三個主要作業系統中的每一個上運行:
就是這樣。另一頭犛牛,剃毛。我希望您覺得這很有用。
以上是使用 Python、PowerShell、C# 或 Go 依大小降序對目錄中的項目進行排序的詳細內容。更多資訊請關注PHP中文網其他相關文章!