我有一个文本文件“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
完全调用(许多)命令。