Linux

在linux中遞歸計算文件的快速方法

  • January 5, 2021

我正在使用以下內容來計算目錄及其子目錄中的文件數:

find . -type f | wc -l

但是我那裡有 50 萬個文件,而且計數需要很長時間。

有沒有一種更快的方法來計算文件的數量,而不涉及將大量文本傳送到計算行數的東西上?這似乎是一種低效的做事方式。

如果您在專用文件系統上有此功能,或者您有穩定數量的文件成本,您可以通過查看文件系統中的 inode 數量來獲得足夠粗略的文件數量計數“ df -i":

root@dhcp18:~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75885 60413843    1% /

在上面的測試框中,我分配了 75,885 個 inode。但是,這些 inode 不僅僅是文件,它們也是目錄。例如:

root@dhcp18:~# mkdir /tmp/foo
root@dhcp18:~# df -i /tmp 
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75886 60413842    1% /
root@dhcp18:~# touch /tmp/bar
root@dhcp18:~# df -i /tmp
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75887 60413841    1% /

注意:並非所有文件系統都以相同的方式維護 inode 計數。ext2/3/4 都可以,但是 btrfs 總是報告 0。

如果您必須將文件與目錄區分開來,您將不得不遍歷文件系統並“統計”每個文件,以查看它是否是文件、目錄、符號連結等……這裡最大的問題不是將所有文本傳送到“wc”,但在所有 inode 和目錄條目中四處尋找以將這些數據放在一起。

除了 “df -i” 顯示的 inode 表之外,實際上沒有給定目錄下有多少文件的數據庫。但是,如果此資訊對您很重要,您可以通過讓您的程序在此目錄中創建文件時增加一個數字並在刪除時減少它來創建和維護這樣的數據庫。如果您不控制創建它們的程序,這不是一個選項。

引用自:https://serverfault.com/questions/205071