![创建文件中指定的目录列表的最快方法是什么?](https://linux22.com/image/34951/%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E4%B8%AD%E6%8C%87%E5%AE%9A%E7%9A%84%E7%9B%AE%E5%BD%95%E5%88%97%E8%A1%A8%E7%9A%84%E6%9C%80%E5%BF%AB%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我有一个文本文件“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
这将在当前工作目录中创建目录/目录树。不是批量创建(如同时创建所有目录),而是一个接一个地创建。