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

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

我有一个文本文件“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

编辑:我增加了索引节点的数量,并减少了目录的深度,这似乎有效。这次用了2分16秒。

答案1

使用 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命令。

答案2

我知道我们会得到这个问题的很多答案。但你仍然可以尝试:) :D

while read -r line; do mkdir -p "$line" ; done < file.txt

答案3

试试这个单行:

for i in $(cat foo.txt) ; do mkdir -p $i ; done

这将在当前工作目录中创建目录/目录树。不是批量创建(如同时创建所有目录),而是一个接一个地创建。

相关内容