创建文件中指定的目录列表的最快方法是什么?

Kai*_*zay 4 mkdir

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

data/bar/foo
data/bar/foo/chum
data/bar/chum/foo
...
Run Code Online (Sandbox Code Playgroud)

可能有数百万个目录和子目录 使用终端命令批量创建所有目录的最快方法是什么?

最快,我的意思是最快地创建所有目录。由于有数百万个目录,因此有许多写操作。

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

自由 -m

 total       used       free     shared    buffers     cached
Mem:          4002       3743        258          0       2870         13
-/+ buffers/cache:        859       3143
Swap:          255         26        229
Run Code Online (Sandbox Code Playgroud)

编辑: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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

编辑:我增加了 inode 的数量,并减少了目录的深度,它似乎有效。这次花了 2 分 16 秒。

Sté*_*las 12

使用 GNU xargs

xargs -d '\n' mkdir -p -- < foo.txt
Run Code Online (Sandbox Code Playgroud)

xargs将运行尽可能少的mkdir命令。

使用标准语法:

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

当它不是有效的就是mkdir -p a/b/c将尝试一些mkdir("a"),可能stat("a")chdir("a")与同为"a/b"即使"a/b"事先存在。

如果您foo.txt有:

a
a/b
a/b/c
Run Code Online (Sandbox Code Playgroud)

按照这个顺序,也就是说,如果对于每个路径,之前每个路径组件都有一行,那么您可以省略-p,这样效率会更高。或者:

perl -lne 'mkdir $_ or warn "$_: $!\n"' < foo.txt
Run Code Online (Sandbox Code Playgroud)

这避免了mkdir完全调用(许多)命令。