避免使用裸的 mkdir -p

首先说明一下,这里的裸是指不事先判断目录是否存在,直接使用 mkdir -p 创建。

如果经常与文件系统打交道,少不了会有创建目录的操作。

比如,我们想在某台机器上同步某个文件目录,就需要确保它的父目录存在。如果不存在,可能还需要根据需要动态创建。

系统提供了很多可以直接使用的命令,它的好处是显而易见的,当你不想在远程装 agent 来操作,而选择使用 ssh 连接,直接使用这些现成命令是一个简单有效的选择。

如果创建目录,可以选择使用 mkdir 命令。如果系统可能有多级目录不存在,我们可能会考虑 -p 选项。

-p 类似于编程里面的递归思想,但是有一点要注意注意注意,它是从文件系统的根开始判断的,而不是从最完整的目录。

strace mkdir -p /tmp/foo/bar/bazz/baxx/apple/boy/cat/dog

# ...
mkdir("/tmp", 0755)                     = -1 EEXIST (File exists)
chdir("/tmp")                           = 0
mkdir("foo", 0755)                      = 0
open("foo", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("bar", 0755)                      = 0
open("bar", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("bazz", 0755)                     = 0
open("bazz", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("baxx", 0755)                     = 0
open("baxx", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("apple", 0755)                    = 0
open("apple", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("boy", 0755)                      = 0
open("boy", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("cat", 0755)                      = 0
open("cat", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 3
fchdir(3)                               = 0
close(3)                                = 0
mkdir("dog", 0755)                      = 0
# ...

天哪,每一级目录,如果存在,会对应两个系统调用(mkdir、chdir);如果不存在,会对应四个系统调用(mkdir、open、fchdir、close)。

当偶而执行一次这类操作,问题倒还不是特别明显。但是当我们频繁执行大量与此类似的深层目录创建的操作时,系统的性能很快就会有所反应。

好的实践是怎样的呢?

首先,我们要创建的目录很有可能已经存在。这一步判断可以避免 mkdir -p 无条件地执行。test 可以判断目录或文件是否存在,它只是一个简单的 stat 系统调用,very cheap。

其次,避免使用绝对路径。如果我们确定 /tmp/foo/bar/bazz/baxx/apple 已经存在,只需要从 apple 创建 boy/cat/dog 这三个目录就可以了,可以节省 1 * 2 + 5 * 4 = 22 次系统调用,这次真是赚到了。

当然,如果只是手动创建目录,-p 并没有太大的副作用。视情况而定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值