Bash

Ext4 和 Linux - 一個目錄中的大量文件 - 操作

  • July 23, 2020

我有一個目錄中有大量文件的問題。

文件系統是 ext4。

我達到了 2**32 文件限制,甚至無法在此分區上寫入任何文件。

問題非常大。

我不知道如何將一些文件移動到其他資源?

經典的“ls”和“mv”不起作用。文件太多了…

有什麼方法可以在 bash 中快速輸出任何文件?

每個目錄一個任意文件,幾乎是 2**32 個文件。

如果我能快速下載一個文件,我可以寫一個腳本。

有任何想法嗎?

請嘗試執行:

ls --sort=none --no-group

或限制為一定數量的文件,例如

ls --sort=none --no-group | head -500

使用ls對大目錄進行操作是非常低效的,因為 GNU會在返回任何ls條目之前讀取目錄中的所有條目,即使使用,因為它希望輸出“漂亮”。這既慢又佔用大量 RAM,因為 ext4 目錄中可能包含數百萬個文件。--sort=none

相反,您應該使用find列出目錄中的文件,這將在從目錄中讀取文件名後立即列印出文件名。如果您想查找特定文件(例如所有小於 1MB 的“*.jpg”文件),您可以執行例如

find /my/directory -type f -name "*.jpg" -size -1M

有關如何使用它的完整詳細資訊,請參見find(1) 手冊頁。

一旦你找到一堆你想要處理的文件,你就可以使用xargs為每個文件執行一個命令。例如,要刪除臨時文件,請使案例如:

find /my/directory -name "*.tmp" -type f -print0 | xargs -0 rm

或將它們移動到不同的目錄中,例如:

find /my/directory -name "*.jpg" -print0 | xargs -0 -I '{}' mv '{}' /my/otherdirectory

或任何數量的東西。該xargs程序為從標準輸入讀取的每個文件執行特定命令,有關詳細資訊,請參見xargs(1) 手冊頁。該mv命令有點複雜,rm因為mv需要將目標目錄放在命令末尾,而xargs通常在指定命令之後添加所有文件。

您可以改為將文件列表保存到輸出文件中find ... > /tmp/file_list,然後編輯file_list以僅包含您要刪除/移動的文件,並將其xargs單獨導入:

xargs -a /tmp/file_list -I '{}' mv '{}' /my/otherdir

引用自:https://unix.stackexchange.com/questions/599601