Administrator
发布于 2026-04-07 / 2 阅读
0

mkdir创建目录

mkdir创建目录

常用:-p创建多级目录
进阶:
1. -m 设置目录权限

tm@server1:~$ mkdir -m 700 private_dir
tm@server1:~$ ls -l
drwx------ 2 tm tm 4096 Mar 23 20:54  private_dir
tm@server1:~$ mkdir -m 755 share_dir
tm@server1:~$ ls -l
drwx------ 2 tm tm 4096 Mar 23 20:54  private_dir
drwxr-xr-x 2 tm tm 4096 Mar 23 20:54  share_dir
  1. -v 显示创建过程

tm@server1:~$ mkdir -pv a1/a2/a3
mkdir: created directory 'a1'
mkdir: created directory 'a1/a2'
mkdir: created directory 'a1/a2/a3'
tm@server1:~$ ls -R a1
a1:
a2

a1/a2:
a3

a1/a2/a3:
  1. {}批量创建

tm@server1:~$ mkdir -v project/{src,logs,docs}
mkdir: created directory 'project/src'
mkdir: created directory 'project/logs'
mkdir: created directory 'project/docs'
tm@server1:~$ ls -R project/
project/:
docs  linux  logs  src

project/docs:

project/linux:
commands

project/linux/commands:

project/logs:

project/src:

tm@server1:~$ mkdir -p project/{src/{main,test},docs}
tm@server1:~$ ls -R project/
project/:
docs  linux  logs  src

project/docs:

project/linux:
commands

project/linux/commands:

project/logs:

project/src:
main  test

project/src/main:

project/src/test:
tm@server1:~$

  1. 脚本中使用变量

tm@server1:~$ BASE_DIR=/home/tm/myproject
tm@server1:~$ mkdir -p "$BASE_DIR"/{logs,backups}
tm@server1:~$ cd "$BASE_DIR/logs"
tm@server1:~/myproject/logs$ 
  1. umask 控制默认权限
    mkdir 的默认权限是 0777 - umask。例如你的 umask 是 0022,新建目录默认权限就是 0755(rwxr-xr-x)。

tm@server1:~$ umask 0077
tm@server1:~$ mkdir secret_dir
tm@server1:~$ ls -l
drwx------ 2 tm tm 4096 Mar 23 21:22  secret_dir
tm@server1:~$ umask 0022

更推荐用 -m 显式指定,更清晰。
umask 是“权限掩码”

  • 作用:它定义了新创建的文件和目录的默认权限。

  • 工作原理
    新目录的默认权限是 0777(rwxrwxrwx),新文件是 0666(rw-rw-rw-)。
    umask 像一把“遮罩”,把对应的权限位去掉
    例如 umask 为 0022,则:

    • 目录:0777 - 0022 = 0755(rwxr-xr-x)

    • 文件:0666 - 0022 = 0644(rw-r--r--)
      和 chmod 的关系

  • chmod 是事后修改已经存在的文件/目录的权限。

  • umask 是预先设定,影响你将来创建的所有文件/目录。
    umask 0022 恢复默认。

  1. 创建带时间戳格式的目录,方便备份

tm@server1:~$ mkdir backup_$(date +"%Y%m%d_%H%M%S")
tm@server1:~$ ls
 a   'a b'   backup_20260323_210621   file2       private_dir   share_dir
 a1   b      file1                    file3.txt   project       test.sh
tm@server1:~$
  1. 结合 find 查找并创建缺失的目录结构

find . -name "*.log" -type f | while read f; do mkdir -p "$(dirname "$f")/archive"; done

这个位置暂时只做了解。大概理解是寻找log文件,将查询到的文件路径存入f,循环路径,在路径对应位置创建archive文件夹
8. 安全创建目录(避免竞争条件)

tm@server1:~$ [ -d "some/dir" ] || mkdir -p "some/dir"
tm@server1:~$ ls -l
drwxr-xr-x 3 tm tm 4096 Mar 23 21:24  some

[ -d "/some/dir" ] 是一个 条件测试命令,它不会输出任何内容到屏幕。
它的作用是检查 /some/dir 是否是一个存在的目录。
如果目录存在,这条命令的 退出状态码 是 0(成功);如果不存在,状态码是 1(失败)。
可以用 echo $? 查看上一条命令的退出状态码

tm@server1:~$ [ -d "/etc/" ]
tm@server1:~$ echo $?
0
tm@server1:~$ [ -d "/test" ]
tm@server1:~$ echo $?
1
tm@server1:~$

脚本使用

if [ -d "/some/dir" ]; then
    echo "目录存在"
else
    echo "目录不存在"
fi

案例:

  1. 一次性创建目录树

tm@server1:~$ mkdir -pv ~/workspace/{python/{data,scripts},docs/{man,html}}
mkdir: created directory '/home/tm/workspace'
mkdir: created directory '/home/tm/workspace/python'
mkdir: created directory '/home/tm/workspace/python/data'
mkdir: created directory '/home/tm/workspace/python/scripts'
mkdir: created directory '/home/tm/workspace/docs'
mkdir: created directory '/home/tm/workspace/docs/man'
mkdir: created directory '/home/tm/workspace/docs/html'
tm@server1:~$ ls -R workspace/
workspace/:
docs  python

workspace/docs:
html  man

workspace/docs/html:

workspace/docs/man:

workspace/python:
data  scripts

workspace/python/data:

workspace/python/scripts:
tm@server1:~$

目录结构如下

tm@server1:~$ sudo apt install tree -y
[sudo] password for tm:
tm@server1:~$ tree workspace/
workspace/
├── docs
│   ├── html
│   └── man
└── python
    ├── data
    └── scripts

7 directories, 0 files
tm@server1:~$

apt下载
treels -R更可视化的输出目录结构
2. 在脚本里创建带权限的日志目录

LOG_DIR="/var/log/myapp"
mkdir -m 750 -p "$LOG_DIR"
chown myuser:mygroup "$LOG_DIR"