在Linux系统里,创建目录最常用也最标准的命令就是mkdir,它是make directories的缩写。无论是手动整理日志文件,还是写脚本批量生成环境目录,基本都绕不开它。理解mkdir的基础写法和参数组合,能帮你在服务器运维和开发部署中少踩很多坑。

一、mkdir命令的基本用法
mkdir最简单的使用方式就是在命令后面直接跟上目录名。比如想在当前路径下新建一个叫test的文件夹,只需要执行下面这行命令。系统会在当前工作目录中生成一个空的test目录,如果当前用户对该路径有写权限,命令执行后不会有任何提示,这就代表创建成功了。
如果你想一次创建多个并列目录,也可以把名字用空格隔开写在后面。例如mkdir a b c会同时生成a、b、c三个文件夹。这种方式在初始化项目结构时很实用,比反复敲三次命令要高效得多。需要注意的是,如果这些名字里有一个已经存在且不是目录,命令就会报错并停止后续创建。
# 在当前目录创建单个目录 mkdir test # 同时创建多个目录 mkdir config logs backup # 查看创建结果 ls -l
二、递归创建多级目录:-p参数
实际开发中经常需要建一层套一层的目录,比如data/2024/raw这种结构。如果父目录data或2024不存在,直接mkdir data/2024/raw会报“没有那个文件或目录”的错误。这时候就要用到-p(parents)参数,它会自动把路径上缺失的父目录全部补建出来,不用你手动一层层去建。
另一个容易被忽略的好处是,当目标目录已经存在时,不加-p会报错退出,而加了-p则静默成功,不会中断你的shell脚本。所以在写自动化脚本时,统一用mkdir -p是更稳妥的写法。下面例子展示了如何用一条命令把整套层级建好。
# 递归创建多级目录,父目录不存在会自动创建 mkdir -p data/2024/raw # 已存在时也不会报错 mkdir -p data/2024/raw # 查看树状结构 ls -R data
三、创建时直接设置权限:-m参数
默认情况下,新建目录的权限由系统的umask值决定,一般是755。如果你希望目录建好就具备特定访问权限,比如只允许拥有者读写执行、其他人完全不能进,可以用-m(mode)参数在创建时直接赋值,而不用再单独跑一趟chmod。
这里的权限写法支持和chmod一样的八进制格式。例如mkdir -m 700 secret会生成一个只有当前用户能操作的目录。要注意的是,-m会忽略umask的影响,按你写的数字精确设权。在部署多用户共享环境或存放密钥的文件夹时,这个参数非常关键。
# 创建只有所有者能读写的目录 mkdir -m 700 secret # 创建所有人可读可进的目录 mkdir -m 755 public # 验证权限 ls -ld secret public
四、显示创建过程与错误排查
当用脚本批量建目录时,你可能希望看到每一步到底建了什么,方便后期排错,这时候可以加-v(verbose)参数。它会把每个实际创建的目录名打印到终端。如果配合-p使用,只会提示那些真正被新建出来的层级,已存在的就不会刷屏。
常见错误主要分两类:一是权限不足,比如在根目录随意建文件夹会报Permission denied,需要用sudo或切到有权限的路径;二是路径里有非法字符或拼写错误。建议先在测试目录试跑命令,确认结构符合预期再移到生产环境。下表列出了几个高频问题和处理方式。
| 现象 | 原因 | 解决办法 |
|---|---|---|
| Permission denied | 当前用户对父目录无写权限 | 更换路径或使用sudo |
| File exists | 目录已存在且未用-p | 加-p参数静默跳过 |
| No such file or directory | 父目录缺失且未用-p | 加-p递归创建 |
五、在脚本中的实践建议
把mkdir写进部署脚本时,推荐始终使用mkdir -p组合,并在关键步骤后用-v输出日志,这样既能保证幂等性,也方便运维回溯。如果目录涉及敏感数据,紧跟着用-m锁好权限,别把赋权动作留到后面,避免时间窗口内被其他进程误读。
另外,在代码里拼接目录路径时要注意变量为空的风险。例如user_dir为空时,mkdir -p /home/$user_dir/log可能直接在home下建出log,而不是预期的用户子目录。先对变量做非空判断,再执行创建,是更严谨的编程习惯。
#!/bin/bash user_dir="alice" if [ -n "$user_dir" ]; then mkdir -p -m 750 /home/$user_dir/log echo "目录已准备完成" else echo "用户名变量为空,终止创建" fi
总体来看,mkdir虽是小命令,但-p、-m、-v这几个参数用熟了,能让你在Linux下管理文件路径时既快又稳。把它和shell判断逻辑结合,基本可以覆盖绝大多数目录初始化的场景。