2008-09-02 160 views
32

單個目錄中是否有最大數量的inode?目錄中的inode的最大數量?

我有一個超過200萬個文件的目錄,無法使ls命令對該目錄工作。所以現在我想知道我是否超過了Linux中inode的限制。 2^64數字限制之前是否有限制?

+0

你的意思是最大數條目在一個單一的目錄,對吧?畢竟,你可以在一個目錄中製作200萬個硬鏈接到同一個文件,這會導致同樣的問題。 – 2008-09-17 04:08:36

回答

0

你能得到真正的文件數量嗎?它是否接近2^n邊界?你可以簡單地用完RAM來保存所有的文件名嗎?

我知道在Windows中至少文件系統的性能會隨着文件夾中文件數量的增加而急劇下降,但我認爲linux並沒有遭受這個問題,至少如果你使用的是命令提示符。上帝幫助你,如果你試圖讓鸚鵡螺等東西打開一個文件夾與許多文件。

我也想知道這些文件來自哪裏。你能夠通過編程來計算文件名嗎?如果是這樣的話,你可以編寫一個小程序將它們分類到多個子文件夾中。通常列出特定文件的名稱將授予您訪問權限,因爲試圖查找名稱將失敗。例如,我在窗口中有一個文件夾,其中包含大約85,000個文件。

如果此技術成功,您可能會嘗試找到一種方法來使此類排序成爲永久性,即使它只是將該小程序作爲cron作業運行。如果您可以在某處按日期對文件進行排序,它將特別有效。

10

編號Inode限制是每個文件系統,並在文件系統創建時決定。你可能會遇到另一個限制,或者'ls'只是表現不佳。

試試這個:

tune2fs -l /dev/DEVICE | grep -i inode 

它應該告訴你種種的inode相關信息。

0

除非您收到錯誤消息,否則ls正在運行,但速度很慢。你可以嘗試尋找在剛剛前十個文件是這樣的:

ls -f | head -10

如果你要需要看的,而文件的詳細信息,你可以把它們放在一個文件中的第一。您可能希望將輸出發送到目前不同的目錄中!

ls > ~/lots-of-files.txt

如果你想要做的事的文件,你可以使用xargs的。如果您決定編寫某種腳本來完成這項工作,請確保您的腳本將流式處理文件列表,而不是一次處理所有文件。以下是移動所有文件的示例。

ls | xargs -I thefilename mv thefilename ~/some/other/directory

你可以結合起來,與頭部移動的文件的數量較少。

ls | head -10000 | xargs -I x mv x /first/ten/thousand/files/go/here

你或許可以結合ls | head成一個shell腳本,將文件分割成在每個文件的管理數量一堆目錄。

+1

ls |頭-10不能立即得到結果,因爲ls正在排序 - 所以在它能打印任何東西之前它需要讀取所有東西。 – 2008-10-20 03:20:26

+0

在這種情況下,請嘗試:ls -f |頭-10 – 2008-10-27 17:20:34

48

df -i應該告訴你,使用和免費的文件系統上的inode數。

17

嘗試ls -Uls -f

ls,默認情況下,字母順序排列的文件。如果您有200萬個文件,那麼這種排序可能需要很長時間。如果ls -U(或可能是ls -f),那麼文件名將立即打印。

3

最大目錄大小取決於文件系統,因此確切的限制會有所不同。但是,擁有非常大的目錄是一種不好的做法。

您應該考慮通過將文件分類到子目錄來縮小目錄。一種常見的方案是使用前兩個字符用於第一級子目錄,如下所示:

 
${topdir}/aa/aardvark 
${topdir}/ai/airplane 

此工作得特別好,如果使用UUID,的GUID或內容的散列值來命名。

1

正如Rob Adams所指出的那樣,ls在顯示文件之前對文件進行排序。請注意,如果您使用的是NFS,NFS服務器將在發送目錄之前排序該目錄,並且200萬條條目可能比NFS超時要長。這使得目錄無法通過NFS登錄,即使使用了-f標誌。

對於其他網絡文件系統也是如此。

雖然沒有強迫限制目錄中的條目數,這是很好的做法,有一些限制,你預料到的條目。

0

對於NetBackup,即分析客戶的目錄下的二進制文件執行某種類型的上市,通過文件的數量巨大超時的每個文件夾(約一百萬每個文件夾,SAP工作目錄)英寸

我的解決辦法(如在此線程查爾斯達菲寫),重組子文件夾中的文件夾用更少的檔案。

-1

另一種選擇是find

find . -name * -exec somcommands {} \;

{}是絕對的文件路徑。

優點/缺點是文件被一個接一個地處理。

find . -name * > ls.txt

將打印所有文件名中ls.txt

find . -name * -exec ls -l {} \; > ls.txt

將打印每個文件的所有信息形式LS在ls.txt

相關問題