Mkdir

創建文件中指定的目錄列表的最快方法是什麼?

  • August 29, 2016

我有一個文本文件“foo.txt”,它在每一行中指定一個目錄:

data/bar/foo
data/bar/foo/chum
data/bar/chum/foo
...

可能有數百萬個目錄和子目錄 使用終端命令批量創建所有目錄的最快方法是什麼?

最快,我的意思是最快的創建所有目錄。由於有數百萬個目錄,因此有許多寫操作。

我正在使用 ubuntu 12.04。

編輯:請記住,該列表可能不適合記憶體,因為有數百萬行,每行代表一個目錄。

編輯:我的文件有 450 萬行,每行代表一個目錄,由字母數字字元、路徑分隔符 “/” 和可能的 “../” 組成

當我執行xargs -d '\n' mkdir -p < foo.txt一段時間後,它一直在列印錯誤,直到我執行 ctrl + c:

mkdir:無法創建目錄`../myData/data/a/m/e/d’:設備上沒有剩餘空間

但是執行df -h會給出以下輸出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda        48G   20G   28G  42% /
devtmpfs        2.0G  4.0K  2.0G   1% /dev
none            401M  164K  401M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm

免費-m

total       used       free     shared    buffers     cached
Mem:          4002       3743        258          0       2870         13
-/+ buffers/cache:        859       3143
Swap:          255         26        229

編輯:df -i

Filesystem      Inodes   IUsed  IFree IUse% Mounted on
/dev/xvda      2872640 1878464 994176   66% /
devtmpfs        512053    1388 510665    1% /dev
none            512347     775 511572    1% /run
none            512347       1 512346    1% /run/lock
none            512347       1 512346    1% /run/shm

df -T

Filesystem     Type     1K-blocks     Used Available Use% Mounted on
/dev/xvda      ext4      49315312 11447636  37350680  24% /
devtmpfs       devtmpfs   2048212        4   2048208   1% /dev
none           tmpfs       409880      164    409716   1% /run
none           tmpfs         5120        0      5120   0% /run/lock
none           tmpfs      2049388        0   2049388   0% /run/shm

編輯:我增加了 inode 的數量,並減少了我的目錄的深度,它似乎工作。這一次用時 2 分 16 秒。

使用 GNU xargs

xargs -d '\n' mkdir -p -- < foo.txt

xargs將執行盡可能少的mkdir命令。

使用標準語法:

(export LC_ALL=C
sed 's/[[:blank:]"\'\'']/\\&/g' < foo.txt | xargs mkdir -p --)

效率不高的地方是,即使事先存在,mkdir -p a/b/c也會嘗試一些mkdir("a")可能stat("a")chdir("a")相同的嘗試。"a/b"``"a/b"

如果您foo.txt有:

a
a/b
a/b/c

按照這個順序,也就是說,如果對於每個路徑,之前的每個路徑組件都有一行,那麼您可以省略-p並且它會顯著提高效率。或者:

perl -lne 'mkdir $_ or warn "$_: $!\n"' < foo.txt

這避免了完全呼叫(許多)mkdir命令。

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