如何在Ubuntu中创建新文件夹:完整目录管理指南
在Ubuntu中创建新文件夹主要通过终端中的mkdir命令完成。基本语法为mkdir folder_name,可立即在当前工作位置创建目录。对于嵌套结构,mkdir -p parent/child/grandchild可在单次操作中创建整个路径,即使中间目录尚不存在。
本指南远不止介绍基础知识。它涵盖了在Ubuntu上创建目录的所有实用方法——从简单的单文件夹创建到递归结构、权限感知配置,以及在实际生产服务器环境中使用的自动化脚本模式。
为什么Linux服务器上的目录结构至关重要
在任何Ubuntu服务器上,文件系统是所有操作的基础。目录组织混乱会引发一系列问题:应用路径断裂、权限层级配置错误、备份任务失败,以及因世界可写目录放置在敏感位置而导致的安全漏洞。
严格的目录管理方法直接影响:
- 权限继承——子目录继承父目录权限,除非明确覆盖,因此初始结构决策至关重要
- 备份范围——
rsync和tar等备份工具在目录树上运行,因此逻辑分组可降低备份复杂性 - 服务配置——Web服务器(Apache、Nginx)、数据库和应用运行时均依赖可预测、定义明确的目录路径
- 审计与合规——结构化路径使日志关联和取证分析速度显著提升
如果您正在管理VPS Hosting环境或独立服务器,从第一天起建立一致的目录规范,可防止随着系统增长而迅速累积的技术债务。
前提条件
在执行以下任何命令之前,请确认以下事项:
- 您可以访问终端(本地或通过SSH)
- 您的用户账户对目标位置具有写入权限
- 对于系统级目录(例如
/etc/或/var/下),您拥有sudo权限 - Ubuntu版本:这些命令普遍适用于Ubuntu 18.04、20.04、22.04和24.04 LTS
要随时验证当前工作目录,请运行:
pwd方法一:使用mkdir创建基本目录
mkdir(创建目录)命令是创建目录的标准POSIX工具,无需安装即可在每个Linux发行版上使用。
语法:
mkdir directory_name示例:
mkdir project_files这将在当前位置创建名为project_files的目录。命令成功时不产生任何输出——这是标准Unix行为。要确认创建结果:
ls -la生产环境中应遵循的命名规范:
- 使用小写字母和下划线或连字符:
web_assets、backup-2024 - 避免在目录名中使用空格——它们需要转义(
mkdir "my folder"或mkdir my folder),并会破坏许多Shell脚本 - 避免特殊字符:
&、*、?、!、|具有Shell特定含义,会导致不可预测的行为
方法二:在指定绝对路径创建目录
您无需先导航到目标位置,可以直接将完整绝对路径传递给mkdir。这是脚本和自动化配置中的首选方法。
语法:
mkdir /full/path/to/new_directory示例:
mkdir /var/www/html/myapp重要限制:如果路径中任何中间目录不存在,此命令将失败。例如,如果/var/www/html/不存在,上述命令将返回:
mkdir: cannot create directory '/var/www/html/myapp': No such file or directory解决方案是使用-p标志,详见方法三。
使用相对路径同样有效,在交互式会话中通常更易读:
mkdir ../sibling_directory
mkdir ./subdirectory方法三:使用-p递归创建嵌套目录
-p(父目录)标志是mkdir中最重要的操作选项之一。它指示命令创建指定路径中所有缺失的中间目录,并抑制目标目录已存在时通常会出现的错误。
语法:
mkdir -p parent_directory/child_directory/grandchild_directory示例:
mkdir -p /var/www/html/myapp/logs/archive如果/var/www/html/myapp/不存在,此单条命令将创建整个链:myapp,然后在其中创建logs,再在其中创建archive。
关键生产用例——Web服务器文档根目录:
mkdir -p /var/www/vhosts/example.com/{public_html,logs,ssl,tmp}这种大括号展开语法(详见方法六)与-p结合使用,是在单条命令中配置新虚拟主机环境的标准模式。
-p标志还可防止幂等脚本中的错误。如果您运行相同的mkdir -p命令两次,第二次执行不做任何操作,并以代码0干净退出。如果不使用-p,第二次运行将返回错误,破坏任何使用set -e(出错即退出)的脚本。
方法四:同时创建多个目录
mkdir接受多个参数,在单次调用中创建所有指定目录。
语法:
mkdir dir1 dir2 dir3示例:
mkdir assets uploads cache sessions这将在当前位置创建四个独立目录。所有目录在同一层级创建——这不是嵌套结构。
与绝对路径结合使用:
mkdir /srv/app/modules /srv/app/config /srv/app/data与-p结合用于多个嵌套路径:
mkdir -p /srv/project/frontend/src /srv/project/backend/src /srv/project/docs这在部署前为新应用搭建目录结构时特别有用。
方法五:使用-m创建具有特定权限的目录
默认情况下,mkdir根据系统的umask值应用权限。在大多数Ubuntu系统上,默认umask为0022,这意味着新目录获得755权限(所有者:读/写/执行;组:读/执行;其他:读/执行)。
在许多服务器场景中,默认权限要么过于宽松,要么过于严格。-m标志允许您在创建时使用八进制表示法设置精确权限。
语法:
mkdir -m octal_mode directory_name常见权限模式:
| 八进制模式 | 符号表示 | 典型用例 |
|---|---|---|
700 | rwx------ | 私人用户数据、SSH密钥目录 |
750 | rwxr-x--- | 与组共享的应用目录 |
755 | rwxr-xr-x | 公共Web文档根目录 |
770 | rwxrwx--- | 团队共享目录 |
777 | rwxrwxrwx | 临时暂存空间(生产环境中避免使用) |
示例——为SSH密钥创建安全目录:
mkdir -m 700 ~/.ssh示例——创建具有正确权限的Web根目录:
mkdir -m 755 /var/www/html/newsite结合-m和-p:
mkdir -p -m 750 /srv/app/config/secrets请注意,使用-p时,模式仅应用于路径中的最终目录,而不应用于所创建的任何中间目录。中间目录获得基于默认umask的权限。如果需要对所有层级进行精确控制,请分别创建每个层级并使用明确的-m标志,或事后使用chmod。
方法六:使用大括号展开创建复杂目录树
大括号展开是Bash Shell的特性——而非mkdir选项——它从单个模式生成多个参数。与mkdir -p结合使用,是创建复杂目录层级最高效的方式。
基本大括号展开:
mkdir -p project/{src,tests,docs,build}这将展开为:
mkdir -p project/src project/tests project/docs project/build多层大括号展开:
mkdir -p app/{frontend/{components,pages,styles},backend/{controllers,models,routes},shared/utils}这将创建以下结构:
app/
├── frontend/
│ ├── components/
│ ├── pages/
│ └── styles/
├── backend/
│ ├── controllers/
│ ├── models/
│ └── routes/
└── shared/
└── utils/这种模式是初始化新应用仓库或在全新VPS with cPanel或裸机服务器上配置应用目录时的标准做法。
方法七:通过Ubuntu图形界面(文件应用)创建目录
对于桌面Ubuntu安装或远程桌面会话,GNOME文件应用(Nautilus)提供了图形化方法。
步骤:
- 从活动菜单或程序坞打开文件应用
- 导航到要创建新文件夹的父目录
- 在目录内的空白区域右键单击
- 从上下文菜单中选择新建文件夹
- 输入所需的文件夹名称并按Enter
键盘快捷键:在Nautilus中,Ctrl+Shift+N可立即创建新文件夹,无需使用右键菜单。
图形界面方法的局限性:
- 创建时无法设置自定义权限——需要在终端或文件属性中进行后续操作
- 无法在单次操作中创建递归嵌套结构
- 在无头服务器环境中不可用(绝大多数生产Ubuntu服务器在没有桌面环境的情况下运行)
对于任何严肃的服务器管理工作,始终优先使用命令行方法。
方法八:通过脚本实现目录创建自动化
在实际服务器管理中,目录很少一次手动创建一个。配置脚本、部署流水线和配置管理工具都依赖于自动化目录创建。
基本Shell脚本示例:
#!/bin/bash
set -e
BASE_DIR="/var/www/vhosts"
DOMAIN="example.com"
directories=(
"$BASE_DIR/$DOMAIN/public_html"
"$BASE_DIR/$DOMAIN/logs"
"$BASE_DIR/$DOMAIN/ssl"
"$BASE_DIR/$DOMAIN/tmp"
"$BASE_DIR/$DOMAIN/backup"
)
for dir in "${directories[@]}"; do
mkdir -p "$dir"
echo "Created: $dir"
done
# Set ownership to web server user
chown -R www-data:www-data "$BASE_DIR/$DOMAIN"
chmod -R 755 "$BASE_DIR/$DOMAIN"
echo "Directory structure for $DOMAIN provisioned successfully."关键脚本实践:
- 始终使用
set -e在任何错误时中止 - 引用所有变量(
"$dir")以安全处理含空格的路径 - 在同一脚本中将
mkdir -p与chown和chmod结合使用,确保创建后立即设置正确权限 - 使用数组存储目录列表,保持脚本可读性和可维护性
这种方法在管理多个虚拟主机、跨环境部署应用或使用Ansible或基于Bash的配置脚本自动化服务器设置时至关重要。
对比:mkdir选项及其用例
| 命令 | 创建中间目录 | 设置权限 | 多个目录 | 幂等性 |
|---|---|---|---|---|
mkdir dir | 否 | 否(使用umask) | 否 | 否 |
mkdir -p path/to/dir | 是 | 否(使用umask) | 否 | 是 |
mkdir -m 755 dir | 否 | 是 | 否 | 否 |
mkdir -p -m 750 path/dir | 是 | 是(仅最终目录) | 否 | 是 |
mkdir dir1 dir2 dir3 | 否 | 否(使用umask) | 是 | 否 |
mkdir -p {a,b,c}/sub | 是 | 否(使用umask) | 是 | 是 |
常见错误及解决方法
错误:Permission denied
mkdir: cannot create directory '/etc/myapp': Permission denied原因:您正在尝试在没有提升权限的情况下写入系统拥有的目录。
解决方法:在命令前加上sudo:
sudo mkdir /etc/myapp错误:No such file or directory
mkdir: cannot create directory '/srv/app/config': No such file or directory原因:路径中一个或多个中间目录不存在。
解决方法:使用-p标志:
mkdir -p /srv/app/config错误:File exists
mkdir: cannot create directory 'mydir': File exists原因:该名称的目录或文件已存在。
解决方法:当现有路径是目录时,使用-p抑制此错误,或选择不同的名称。
脚本中的静默失败:如果mkdir失败,而您的脚本未使用set -e或检查退出代码,后续操作可能在不存在的路径上继续执行,导致不可预测的失败。始终验证关键目录创建:
mkdir -p /srv/app/data || { echo "Failed to create data directory"; exit 1; }目录创建的安全注意事项
目录权限是服务器安全的第一道防线。多个高影响漏洞直接源于错误的目录权限:
- 世界可写目录(
777)允许系统上的任何用户写入、修改或删除文件——在共享主机或多用户服务器上是严重风险 - 面向Web的目录上所有权不正确可能允许Web应用漏洞在预期文档根目录之外写入恶意文件
- 共享目录上的粘滞位(
chmod +t,如/tmp)防止用户删除他人拥有的文件——始终在共享可写目录上设置此位 - 目录上的SetGID位确保新文件继承目录的组,而非创建用户的主组——对协作项目目录很有用
示例——安全的共享项目目录:
mkdir -p /srv/shared/project
chown root:developers /srv/shared/project
chmod 2775 /srv/shared/project # SetGID + rwxrwxr-x在托管Web应用、SSL安全域名或电子邮件服务时,正确的目录权限与您的SSL证书配置和电子邮件托管设置的安全态势密不可分。
验证目录创建
创建目录后,在进行依赖操作之前,始终验证结果。
列出详细权限:
ls -la /path/to/parent/验证特定目录是否存在(在脚本中很有用):
[ -d /srv/app/config ] && echo "Directory exists" || echo "Directory missing"查看完整树形结构(需要tree软件包):
sudo apt install tree -y
tree /srv/app/检查inode使用情况——在拥有大量小文件的服务器上,即使磁盘空间可用,inode耗尽也会阻止目录创建:
df -i /srv/如果inode使用率接近100%,无论可用磁盘空间如何,您都无法创建新目录或文件。这是托管大量小文件的服务器(如邮件服务器或PHP会话目录)上常见的生产问题。
实用决策矩阵:选择哪种方法
| 场景 | 推荐命令 |
|---|---|
| 单个目录,交互式会话 | mkdir dirname |
| 已知绝对路径的目录 | mkdir /full/path/dirname |
| 嵌套路径,部分父目录可能不存在 | mkdir -p /full/nested/path |
| 同时创建多个同级目录 | mkdir dir1 dir2 dir3 |
| 单条命令创建复杂多层树 | mkdir -p root/{a,b,c}/{sub1,sub2} |
| 具有非默认权限的目录 | mkdir -m 750 dirname |
| 自动化配置脚本 | mkdir -p与chown/chmod顺序执行 |
| 幂等部署流水线步骤 | mkdir -p(可安全重复运行) |
关键技术要点
mkdir -p是任何脚本或自动化目录创建的最安全默认选项——它是幂等的,并处理缺失的中间路径
切勿在生产目录上使用777权限;公共路径优先使用755,敏感数据使用750或700-m中的mkdir标志与-p一起使用时仅对最终目录设置权限——对所有层级进行完全控制请使用chmod -R或逐层mkdir调用mkdir特性——除非Shell是Bash,否则在/bin/sh脚本中无法使用df -i)chown分配结合,避免目录以错误所有权存在的时间窗口www-data或nginx)必须对文档根路径中的每个目录拥有执行权限——而不仅仅是最终目录常见问题
mkdir folder和mkdir -p folder有什么区别?
mkdir folder创建单个目录,如果路径的任何部分不存在或目录已存在则失败。mkdir -p folder创建所有缺失的中间目录,如果目标已存在则静默退出不报错,使其适用于脚本和重复执行。
mkdir能创建名称中含空格的目录吗?
可以。将名称用引号括起来:mkdir "my project folder",或转义空格:mkdir my project folder。但是,强烈不建议在服务器上的目录名中使用空格,因为它们在每个后续命令中都需要转义,并会破坏许多Shell脚本和应用配置。
为什么即使使用sudo,mkdir也会提示”权限被拒绝”?
这通常发生在目标文件系统以只读方式挂载、SELinux或AppArmor策略限制对该路径的写入,或路径位于具有服务器端限制的网络文件系统上时。使用mount | grep /target/path检查挂载选项,并使用sudo aa-status查看AppArmor日志。
如何创建目录并立即设置其所有者和组?
mkdir本身不设置所有权——之后立即使用chown:mkdir -p /srv/app && chown www-data:www-data /srv/app。在单条流水线中:install -d -m 755 -o www-data -g www-data /srv/app——install命令在一步中创建具有所有者、组和模式的目录。
使用mkdir -p创建多个新层级时,权限会如何处理?
只有最终(最深层)目录接收-m指定的模式。所有新创建的中间目录获得从当前umask派生的权限。如果需要所有层级的一致权限,请分别创建每个层级并使用明确的-m标志,或在创建完整路径后应用chmod -R。
