Bash
Ext4 和 Linux - 一個目錄中的大量文件 - 操作
我有一個目錄中有大量文件的問題。
文件系統是 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