Mkdir
創建文件中指定的目錄列表的最快方法是什麼?
我有一個文本文件“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
命令。