Linux mkdir 命令 - 创建目录

mkdir 命令(Make Directory)是Linux和Unix系统中用于创建新目录的基本命令。它是文件系统管理中最常用和最基础的命令之一,允许用户创建单个目录或多级目录结构。

Linux mkdir 与 Windows 创建目录的对比
  • Linux/Unix: mkdir 目录名
  • Windows 命令行: mkdir 目录名md 目录名
  • Windows 图形界面: 右键 → 新建 → 文件夹
  • 主要区别: Linux的mkdir有更多选项,如设置权限、创建多级目录等

语法格式

mkdir [选项] 目录名 [目录名2 ...]

可以同时创建多个目录,目录名之间用空格分隔。

常用选项

选项 说明
-p--parents 递归创建目录,如果父目录不存在则一并创建
-m--mode=MODE 设置目录的权限模式(类似chmod)
-v--verbose 显示每个创建的目录信息
--help 显示帮助信息
--version 显示版本信息
-Z 设置安全上下文(SELinux系统)

基本示例

示例1:创建单个目录

# 在当前目录创建名为"documents"的目录
mkdir documents

# 创建带空格的目录名(使用引号)
mkdir "my documents"

# 在指定路径创建目录
mkdir /home/user/downloads

# 创建多个目录
mkdir dir1 dir2 dir3

示例2:递归创建多级目录

# 创建多级目录(如果父目录不存在会报错)
mkdir /home/user/projects/2024/java

# 使用-p选项递归创建(推荐)
mkdir -p /home/user/projects/2024/java

# 创建复杂的目录结构
mkdir -p project/{src,test,docs,lib}

使用花括号扩展创建多个子目录:

project/
├── src/
├── test/
├── docs/
└── lib/

示例3:创建目录时设置权限

# 创建目录并设置权限为755(rwxr-xr-x)
mkdir -m 755 public_dir

# 创建目录并设置权限为700(仅所有者可读写执行)
mkdir -m 700 private_dir

# 创建目录并设置权限为777(所有人可读写执行)
mkdir -m 777 shared_dir

# 创建目录并设置粘滞位(只有所有者可以删除文件)
mkdir -m 1777 tmp_dir

权限说明:

  • 755: 所有者rwx,组用户r-x,其他用户r-x(常用)
  • 700: 仅所有者rwx,其他人无权限(私有目录)
  • 777: 所有人rwx(共享目录,需谨慎)
  • 1777: 带粘滞位的777(如/tmp目录)

示例4:详细模式创建目录

# 显示每个创建的目录信息
mkdir -v new_directory
# 输出: mkdir: 已创建目录 'new_directory'

# 递归创建并显示信息
mkdir -pv /home/user/projects/{src,test,lib}
# 输出:
# mkdir: 已创建目录 '/home/user/projects/src'
# mkdir: 已创建目录 '/home/user/projects/test'
# mkdir: 已创建目录 '/home/user/projects/lib'

高级用法

示例5:使用变量和表达式创建目录

# 使用变量创建目录
username="john"
mkdir "/home/${username}/documents"

# 使用日期创建目录
mkdir "backup_$(date +%Y%m%d)"

# 创建序列目录
mkdir dir{1..10}
# 创建带前缀的序列目录
mkdir section_{A..D}

# 创建数字补零的序列目录
mkdir image_{001..005}

示例6:在脚本中安全创建目录

#!/bin/bash
# safe_mkdir.sh - 安全创建目录的脚本

DIR_PATH="/var/www/myapp/logs"

# 检查目录是否已存在
if [ -d "$DIR_PATH" ]; then
    echo "错误: 目录 '$DIR_PATH' 已存在"
    exit 1
fi

# 尝试创建目录
mkdir -p "$DIR_PATH"

# 检查是否创建成功
if [ $? -eq 0 ]; then
    echo "目录创建成功: $DIR_PATH"

    # 设置适当的权限
    chmod 755 "$DIR_PATH"
    echo "权限设置为755"
else
    echo "目录创建失败"
    exit 1
fi

示例7:创建带特殊字符的目录

# 创建以点开头的隐藏目录
mkdir .config
mkdir .ssh

# 创建带连字符的目录
mkdir my-project

# 创建带下划线的目录
mkdir my_project

# 创建带特殊字符的目录(需要转义)
mkdir test\&temp
mkdir 'test&temp'
mkdir "test&temp"

# 创建带空格的目录(三种方法)
mkdir my\ documents
mkdir 'my documents'
mkdir "my documents"

实际应用场景

场景1:创建项目目录结构
# 创建标准的Web项目目录结构
mkdir -p my_website/{css,js,images,docs,backup}

# 创建Java项目目录结构
mkdir -p java_project/{src/{main,test}/{java,resources},lib,dist,doc}

# 创建Python项目目录结构
mkdir -p python_project/{src,tests,docs,data,logs}
场景2:批量创建用户目录
#!/bin/bash
# create_user_dirs.sh - 批量创建用户目录

USERS="alice bob charlie david eve"

for user in $USERS; do
    # 创建用户主目录结构
    mkdir -p "/home/$user"/{documents,downloads,music,pictures,public_html}

    # 设置权限
    chmod 755 "/home/$user"
    chmod 700 "/home/$user"/{documents,downloads,music,pictures}
    chmod 755 "/home/$user/public_html"

    echo "已创建用户 $user 的目录结构"
done
场景3:创建日志和备份目录
# 创建带日期的日志目录
mkdir -p /var/log/myapp/$(date +%Y)/$(date +%m)/$(date +%d)

# 创建带时间戳的备份目录
mkdir -p "/backup/$(date +%Y%m%d_%H%M%S)"

# 创建轮转的日志目录
for i in {0..6}; do
    mkdir -p "/var/log/myapp/$(date -d "$i days ago" +%Y%m%d)"
done

目录权限详解

权限值 八进制 符号表示 说明
完全私有 700 rwx------ 仅所有者可读、写、执行
标准目录 755 rwxr-xr-x 所有者可读写执行,其他人只读执行(最常用)
组共享 775 rwxrwxr-x 所有者和组成员可读写执行,其他人只读执行
完全共享 777 rwxrwxrwx 所有人都可读写执行(需谨慎使用)
只读目录 555 r-xr-xr-x 所有人都只能读取和执行,不能修改
粘滞位目录 1777 rwxrwxrwt 如/tmp目录,用户只能删除自己的文件
特殊权限说明

除了基本的读写执行权限外,Linux目录还有几个特殊权限位:

  • 粘滞位 (t): 目录中文件只能被文件所有者、目录所有者或root删除(如/tmp
  • SetGID (s): 在该目录中创建的文件会继承目录的组所有权
  • SetUID (s): 对目录无效,主要用于可执行文件
  • 设置方法: mkdir -m 2775 shared_dir(设置SetGID)

注意事项

  • 目录已存在: 如果要创建的目录已存在,mkdir会报错(除非使用-p选项的一部分情况)
  • 权限不足: 如果没有在目标位置创建目录的权限,命令会失败
  • 空格处理: 目录名包含空格时,需要使用引号或转义空格
  • 特殊字符: 目录名包含特殊字符(如&;|)时需要转义
  • 路径长度: Linux支持长路径名,但某些文件系统可能有路径长度限制
  • 磁盘空间: 创建目录需要少量磁盘空间(存储目录元数据)
  • 父目录权限: 需要在父目录有写权限才能创建子目录
  • 符号链接: 如果路径中包含符号链接,mkdir会创建实际的目录

相关命令

  • rmdir: 删除空目录
  • rm -r: 递归删除目录及其内容
  • ls: 列出目录内容
  • cd: 切换工作目录
  • pwd: 显示当前工作目录
  • chmod: 修改文件或目录权限
  • chown: 修改文件或目录所有者和组
  • tree: 以树状图列出目录内容
  • find: 查找文件或目录
  • touch: 创建空文件或更新文件时间戳

常见问题与故障排除

# 1. "权限被拒绝"错误
# 检查当前目录权限
ls -ld .
# 使用sudo或以正确用户身份运行
sudo mkdir /usr/local/myapp

# 2. "文件已存在"错误
# 检查是否已存在同名文件或目录
ls -l 目录名
# 如果存在文件而非目录,需要先删除文件
rm 文件名
# 或者创建不同名称的目录

# 3. 无法创建多级目录
# 使用-p选项
mkdir -p /path/to/multi/level/directory

# 4. 创建后权限不正确
# 使用-m选项指定权限
mkdir -m 755 mydir
# 或者创建后使用chmod修改
chmod 755 mydir

# 5. 目录名包含特殊字符
# 使用引号或转义字符
mkdir "my dir"
mkdir my\ dir
mkdir 'test&temp'

# 6. 磁盘空间不足
# 检查磁盘空间
df -h
# 清理空间后重试

# 7. 达到inode限制
# 检查inode使用情况
df -i
# 某些文件系统可能达到inode限制

相关环境变量

# 1. UMASK - 控制默认权限
# 查看当前umask值
umask
# 设置umask(如022,则新建目录权限为755)
umask 022

# 2. TMPDIR - 临时目录位置
# 查看临时目录
echo $TMPDIR
# 在指定临时目录创建文件
mkdir $TMPDIR/my_temp_dir

# 3. HOME - 用户主目录
# 在主目录创建目录
mkdir $HOME/my_dir

# 4. PWD - 当前工作目录
# 在当前目录创建子目录
mkdir $PWD/new_dir
mkdir 命令最佳实践
  • 使用-p选项: 创建多级目录时总是使用-p选项,避免目录不存在错误
  • 明确权限: 使用-m选项明确设置目录权限,而不是依赖umask
  • 检查存在性: 在脚本中先检查目录是否存在,避免错误
  • 使用变量: 在脚本中使用变量存储路径,提高可维护性
  • 避免特殊字符: 尽量使用字母、数字、下划线和连字符,避免空格和特殊字符
  • 记录操作: 使用-v选项或在脚本中添加日志记录
  • 清理临时目录: 脚本中创建的临时目录应在使用后清理