mkdir 命令从命令行创建目录,使用单个命令处理从单个文件夹到复杂嵌套结构的所有内容。无论您是组织项目文件、设置服务器目录树还是编写自动部署脚本,mkdir 都可以让您精确控制目录创建和权限,而无需接触文件管理器。
您将学习如何创建单个和多个目录、一步构建具有父目录的嵌套目录结构、在创建过程中设置特定权限、处理目录名称中的空格以及使用大括号扩展等功能将 mkdir 集成到脚本中。通过了解 mkdir 的核心选项和实用模式,您可以有效地构建文件系统并自动执行目录设置任务。
如果您不熟悉 mkdir,请将其视为组织 Linux 文件系统的基础。它创建保存文件、脚本、日志和配置数据的文件夹。您看到的每个目录都是使用 mkdir 手动创建的,或者是由调用相同底层系统函数的软件以编程方式创建的。
基本语法细分
mkdir 命令遵循以下结构:
mkdir [OPTIONS] DIRECTORY_NAME...- 目录:命令本身,“make directory”的缩写。
- [选项]:修改行为的可选标志(权限、父创建、详细输出)。
- DIRECTORY_NAME:要创建的一个或多个目录名称。用空格分隔多个名称。
最简单地说,mkdir project创建一个名为的目录project在您当前的位置。您可以通过列出它们来一次创建多个目录:mkdir docs src tests创建三个单独的目录。
常用选项参考
按任务组织的最有用的 mkdir 选项:
| 任务 | 选项 | 它的作用 |
|---|---|---|
| 创建父目录 | -p,--parents | 自动创建缺失的父目录;如果目录存在则不会出错 |
| 创建时设置权限 | -m MODE,--mode=MODE | 使用八进制 (755) 或符号 (u=rwx,g=rx,o=rx) 表示法设置权限 |
| 看看 mkdir 在做什么 | -v,--verbose | 为每个创建的目录打印一条消息 |
| 获得帮助 | --help | 显示使用信息和所有可用选项 |
| 检查版本 | --version | 显示 mkdir 版本(GNU coreutils 包的一部分) |
这-p选项特别强大。它可以处理嵌套目录创建,而无需您手动创建每个级别,并且可以防止目录已存在时出现错误,这使其成为需要确保目录结构而不会在重新运行时失败的脚本的理想选择。
安装
mkdir 命令作为 GNU coreutils 的一部分提供在几乎每个 Linux 发行版上。通过以下方式验证其存在:
mkdir --version如果 mkdir 不知何故丢失(极其罕见,通常只在最小的容器中),请安装 coreutils 包:
基于 Ubuntu 和 Debian 的发行版:
sudo apt install coreutilsFedora、RHEL、Rocky Linux 和 AlmaLinux:
sudo dnf install coreutilsArch Linux 和 Manjaro:
sudo pacman -S coreutils开放SUSE:
sudo zypper install coreutils阿尔卑斯Linux:
sudo apk add coreutils根图:
sudo emerge sys-apps/coreutils无效的Linux:
sudo xbps-install -S coreutils实际例子
示例 1:创建单个目录
最常见的用例是在当前位置创建单个目录:
mkdir new_directory这创造了new_directory在您当前的工作目录中。使用常见的 022 umask(用户文件创建掩码,删除组和其他人的写入权限,类似于 Windows 继承其他帐户的只读权限),权限解析为 755(所有者可以读/写/执行,组和其他人可以读/执行);不同的 umask 会产生不同的默认值。目录立即出现;除非您添加,否则不会出现确认消息-v旗帜。
示例 2:一次创建多个目录
在设置项目结构时,您经常需要同时创建多个目录:
mkdir docs src tests config这将创建四个单独的目录(docs,src,tests, 和config)使用单个命令在当前位置。每个目录都是独立的;如果一个已经存在, mkdir 将在该特定名称上出错,但仍会创建其他名称。
示例 3:创建嵌套目录结构
这-p选项自动创建父目录,让您可以通过一个命令构建整个目录树:
mkdir -p project/src/components/auth这将创建整个路径。如果project,src,components, 或者auth目录不存在, mkdir 按顺序创建它们。没有-p,如果缺少任何父目录,您会收到错误消息。对于需要确保目录结构存在且不会在重新运行时失败的脚本来说,此选项至关重要。
示例4:创建过程中设置权限
这-m选项允许您在创建时指定权限,这比创建具有默认权限的目录然后使用以下命令更改它们更安全:
mkdir -m 700 private_data这创造了private_data权限设置为 700(仅限所有者读取、写入和执行;组或其他人无权访问)。使用八进制表示法(如 700 或 755)是最常见的方法,但您也可以使用符号表示法:mkdir -m u=rwx,g=,o= private_data达到相同的结果。
示例 5:使用详细输出进行确认
当创建许多目录或在脚本中运行 mkdir 时,-v标志提供了对所创建内容的确认:
mkdir -v reports logs backups这会为每个目录打印诸如“mkdir:已创建目录'reports'”之类的消息。结合-v和-p查看整个路径创建:mkdir -pv data/2024/november显示创建的每个中间目录。
示例 6:处理带空格的目录名称
当目录名包含空格时,请将它们括在引号中,以防止 shell 将每个单词视为单独的目录名:
mkdir "Client Projects" "Meeting Notes"这将创建两个名称中带有空格的目录。您还可以使用反斜杠转义各个空格(mkdir Client\ Projects),但当目录名称包含多个空格时,引号会更清晰。
示例 7:创建具有完整路径的目录
指定绝对或相对路径以在文件系统中的任何位置创建目录,而不仅仅是当前位置:
sudo mkdir /var/www/mysite/uploads
mkdir ~/documents/2024/invoices第一个命令创建uploads在/var/www/mysite(父目录必须已经存在,除非您添加-p)并要求sudo因为/var是系统目录。第二个创建invoices在你的主目录下documents/2024。当在不同的目录中工作或为系统范围的位置编写目录创建脚本时,使用完整路径很有帮助。
示例 8:创建隐藏目录
在 Linux 中,以点 (.) 开头的文件和目录在正常目录列表中是隐藏的:
mkdir .cache .config .local这将创建三个隐藏目录。他们不会出现在ls输出除非你使用ls -a(显示所有文件)。隐藏目录通常用于应用程序配置、缓存数据和用户特定的设置,这些设置不应扰乱正常的目录列表。
示例 9:对连续目录使用大括号扩展
Bash 的大括号扩展功能可让您有效地生成目录名称序列:
mkdir week{1..12}
mkdir -p project/{src,tests,docs,config}第一个命令创建week1,week2, 通过week12。第二个在下面创建四个目录project在一个命令中。您可以组合范围和列表:mkdir -p 2024/{q1,q2,q3,q4}/{reports,data}创建一个两级结构,其中包含季度和每个季度的子目录。
示例 10:当目录存在时防止错误
这-p即使目录已经存在,选项也会默默地成功,这使得它非常适合可以重复运行而不会出现错误的幂等脚本:
mkdir -p logs backups data多次运行此命令,每次都会成功完成。如果目录存在,则不会发生任何变化;如果它们丢失了,它们就会被创建。没有-p, 跑步mkdir logs什么时候logs已经存在会产生错误并失败。
示例 11:从文本文件创建目录
当您有要创建的目录列表(可能来自项目模板或清单)时,请使用简单的循环读取文件,以便每个名称保持不变:
while IFS= read -r dir; do
mkdir -- "$dir"
done < directory_list.txt如果directory_list.txt包含目录名称(每行一个),此循环创建所有目录名称,同时保留空格和特殊字符。添加-p到 mkdir 调用(mkdir -p -- "$dir") 当列表包含嵌套路径时,会自动创建父目录。当跨多个系统配置一致的目录结构时,此模式非常有用。
示例 12:组合选项以创建复杂目录
现实场景通常需要组合多个 mkdir 选项:
sudo mkdir -pvm 750 /var/app/data/{uploads,exports,cache}这会在下面创建三个目录/var/app/data(创建/var/app/data如果需要),将权限设置为 750(所有者完全访问权限,组读取/执行,其他无),并打印详细输出,显示创建的每个目录。组合-p,-v, 和-m为您提供带有自定义权限和确认反馈的安全嵌套创建,同时sudo提供所需的 root 权限/var。
示例 13:为共享目录设置粘滞位
粘性位(八进制 1000)保护共享目录中的文件,因此只有文件所有者(或 root)可以删除或重命名自己的文件:
mkdir -m 1777 /tmp/shared_workspace这将创建一个对每个人都具有完全权限的目录 (777) 加上粘性位 (1),结果是八进制 1777。粘性位对于像这样的目录至关重要/tmp多个用户需要写访问权限但不能删除彼此的文件。你会看到一个t运行时的权限中ls -ld。
示例 14:为群组协作设置 SGID 位
SGID(设置组 ID)位确保在目录中创建的文件继承目录的组所有权,而不是创建用户的主要组,这对于团队协作很有价值:
sudo mkdir -m 2775 /opt/team_project这将创建一个目录,其所有者和组具有读/写/执行权限,其他人具有读/执行权限 (775),加上 SGID 位 (2),得到八进制 2775。当团队成员在此目录中创建文件时,这些文件自动属于该目录的组而不是他们的个人组。你会看到一个s运行时处于组执行位置ls -ld。 SUID 位 (4) 很少与目录一起使用,通常保留给需要提升权限的可执行文件,并且sudo这里是必要的,因为/opt是系统拥有的。
示例 15:将 mkdir 与 find 集成以进行批量操作
当您需要重新创建目录结构或镜像层次结构时,请组合自动化复杂的操作:
find source_project -type d -exec sh -c 'rel=${1#source_project}; mkdir -p "backup_project$rel"' _ {} \;这会找到下面的所有目录source_project并直接在下面重新创建结构backup_project。 shell 片段剥离了source_project/前缀,创建backup_project一旦处理根条目,则附加嵌套目录的每个相对路径。在准备暂存环境、在文件同步之前创建备份目录树或配置并行测试结构时,此模式非常有用。对于更简单的无文件镜像,请运行:
rsync -av --include='*/' --exclude='*' source/ destination/rsync 命令仅复制目录,同时跳过文件,从而生成原始项目的干净框架。
常见错误和故障排除
权限被拒绝错误
当 mkdir 失败并显示“权限被拒绝”时,您缺乏父目录的写入权限。检查权限ls -ld /path/to/parent并请求适当的访问权限或使用您具有写入权限的位置。系统目录如/usr,/opt, 或者/var通常需要sudo:
sudo mkdir /var/app/logs文件存在错误
错误“无法创建目录:文件存在”表示具有该名称的文件或目录已存在。如果您想继续,请添加-p使命令幂等。如果常规文件(不是目录)阻塞了路径,则必须在创建目录之前将其删除或重命名。
缺少父目录错误
没有-p,如果父目录不存在,则 mkdir 失败:“无法创建目录:没有这样的文件或目录。”总是使用mkdir -p path/to/nested/dir对于嵌套结构或当您不确定父级是否存在时。
目录名称中的特殊字符
避免特殊字符,例如/ \ : * ? " < > |在目录名称中。正斜杠是路径分隔符,不能出现在名称中。其他字符会导致 shell 解释问题。当名称包含空格、撇号或引号时,请始终将整个名称括在双引号中或使用反斜杠转义特殊字符。
权限语法不正确
使用时-m,确保八进制值有效(每个数字 0-7)。常见错误包括使用 8 或 9(无效的八进制数字)或忘记权限需要三位或四位数字。如果符号表示法看起来更清晰,请使用-m u=rwx,g=rx,o=语法而不是八进制。
文件系统限制
某些文件系统施加路径长度限制(在现代 Linux 上通常为 4096 个字符)或目录深度限制。嵌套过深可能会导致失败。此外,文件系统有 inode 限制;如果您用尽了可用的 inode,即使有可用磁盘空间,mkdir 也会失败。检查与df -i查看 inode 使用情况。
结论
mkdir 命令提供对目录创建的完全控制,以精确的权限处理从单个文件夹到复杂嵌套结构的所有内容。通过掌握核心选项,例如-p用于自动创建父级,-m用于在创建时设置权限,以及-v对于确认反馈,您可以有效地构建文件系统并构建可靠的脚本来配置目录树,而无需手动干预。无论您是组织项目文件、配置服务器环境还是自动化部署工作流程,mkdir 都能为您提供构建块来准确创建您需要的目录结构。当您需要删除空目录时,为干净的文件系统管理提供补充功能。
