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
-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:
{}批量创建
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:~$
脚本中使用变量
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$
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恢复默认。
创建带时间戳格式的目录,方便备份
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:~$
结合
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
案例:
一次性创建目录树
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下载tree比ls -R更可视化的输出目录结构
2. 在脚本里创建带权限的日志目录
LOG_DIR="/var/log/myapp"
mkdir -m 750 -p "$LOG_DIR"
chown myuser:mygroup "$LOG_DIR"