必须加-p,否则父目录不存在时必然失败;-p可递归创建所有中间目录且静默跳过已存在目录,批量同级目录用大括号展开,含空格或特殊字符时需用while read安全处理。

mkdir -p 是必须加的,不加就失败
Linux 默认不允许创建上级目录不存在的路径。比如执行 mkdir a/b/c,只要 a 或 a/b 任一父级不存在,就会报错:mkdir: cannot create directory ‘a/b/c’: No such file or directory。这不是“建议加”,而是“不加-p就必然失败”。加了 -p 后,mkdir 会自动补全所有中间层级,且对已存在的目录静默跳过,不报错也不覆盖。
批量创建同级目录:用 shell 大括号展开,别手写多条命令
要建 log202401 到 log202412 这 12 个目录,直接写:mkdir log2024{01..12}。shell 在传参前就完成展开,等价于执行 mkdir log202401 log202402 ... log202412。
常见踩坑点:
-
{1..12}不补零,结果是log20241、log20242…log202412,排序和命名都不规整 - 大括号内不能有空格:
mkdir {a, b}实际建的是a和b(注意第二个名字开头有空格) - 名字含空格、括号、中文时,大括号展开会直接崩,此时必须换方案
名字不规则或含空格?用 while read 安全读取列表
当目录名来自外部文件(如 CSV 提取、用户输入、日志解析),或本身含空格、括号、中文时,mkdir 会把它们拆成多个参数,导致报错:mkdir: missing operand。
最稳做法是把名字按行存进文本(如 dirs.txt),再用 while IFS= read -r 逐行处理:
while IFS= read -r dir; do mkdir -p "$dir" done <p>关键在 <code>IFS=</code>(防止首尾空格被截断)和 <code>-r</code>(防止反斜杠被转义)。漏掉任一个,像 <code>user data</code> 就会被拆成两个参数,<code>mkdir</code> 收到 <code>user</code> 和 <code>data</code>,直接失败。</p> <h3>权限不稳定?显式用 -m,别信 umask</h3> <p>新建目录默认权限由当前 <code>umask</code> 决定,而 <code>umask</code> 可能因用户、环境、shell 启动方式不同而变。比如本地是 <code>0002</code>,上线后变成 <code>0022</code>,新建目录就少了 group 写权限。</p> <p>需要确定权限时,必须显式加 <code>-m</code>:</p>
-
mkdir -m 755 -p deploy/{bin,etc,logs}—— 最终创建的三个目录都是755 -
-m只影响最终目录,不影响中间父目录(除非你也对父目录路径单独指定-m) - 权限数字别写错:
mkdir -m 644 dir会失败,因为目录至少得有执行位(x),否则无法cd进入
真正容易被忽略的是中间目录权限不一致的问题:用 mkdir -m 755 -p a/b/c,只有 c 是 755,a 和 a/b 仍走 umask。如果整个路径都需要统一权限,得拆成多条带 -m 的命令,或改用 install -d。











