15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
16.11.2023

如何在Ubuntu中创建新文件夹:完整目录管理指南

在Ubuntu中创建新文件夹主要通过终端中的mkdir命令完成。基本语法为mkdir folder_name,可立即在当前工作位置创建目录。对于嵌套结构,mkdir -p parent/child/grandchild可在单次操作中创建整个路径,即使中间目录尚不存在。

本指南远不止介绍基础知识。它涵盖了在Ubuntu上创建目录的所有实用方法——从简单的单文件夹创建到递归结构、权限感知配置,以及在实际生产服务器环境中使用的自动化脚本模式。

为什么Linux服务器上的目录结构至关重要

在任何Ubuntu服务器上,文件系统是所有操作的基础。目录组织混乱会引发一系列问题:应用路径断裂、权限层级配置错误、备份任务失败,以及因世界可写目录放置在敏感位置而导致的安全漏洞。

严格的目录管理方法直接影响:

  • 权限继承——子目录继承父目录权限,除非明确覆盖,因此初始结构决策至关重要
  • 备份范围——rsynctar等备份工具在目录树上运行,因此逻辑分组可降低备份复杂性
  • 服务配置——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_assetsbackup-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

常见权限模式:

八进制模式符号表示典型用例
700rwx------私人用户数据、SSH密钥目录
750rwxr-x---与组共享的应用目录
755rwxr-xr-x公共Web文档根目录
770rwxrwx---团队共享目录
777rwxrwxrwx临时暂存空间(生产环境中避免使用)

示例——为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)提供了图形化方法。

步骤:

  1. 从活动菜单或程序坞打开文件应用
  2. 导航到要创建新文件夹的父目录
  3. 在目录内的空白区域右键单击
  4. 从上下文菜单中选择新建文件夹
  5. 输入所需的文件夹名称并按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 -pchownchmod结合使用,确保创建后立即设置正确权限
  • 使用数组存储目录列表,保持脚本可读性和可维护性

这种方法在管理多个虚拟主机、跨环境部署应用或使用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 -pchown/chmod顺序执行
幂等部署流水线步骤mkdir -p(可安全重复运行)

关键技术要点

    mkdir -p是任何脚本或自动化目录创建的最安全默认选项——它是幂等的,并处理缺失的中间路径
    切勿在生产目录上使用777权限;公共路径优先使用755,敏感数据使用750或700
  • -m中的mkdir标志与-p一起使用时仅对最终目录设置权限——对所有层级进行完全控制请使用chmod -R或逐层mkdir调用
  • 大括号展开是Bash特性,而非mkdir特性——除非Shell是Bash,否则在/bin/sh脚本中无法使用
  • 在高密度文件系统上批量创建目录之前,始终检查inode可用性(df -i
  • 在配置脚本中将目录创建与立即chown分配结合,避免目录以错误所有权存在的时间窗口
  • VPS控制面板环境中,Web服务器用户(通常为www-datanginx)必须对文档根路径中的每个目录拥有执行权限——而不仅仅是最终目录
  • 常见问题

    mkdir foldermkdir -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本身不设置所有权——之后立即使用chownmkdir -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

    15%

    全场主机优惠15%

    测试技能,享折扣

    使用代码:

    Skills
    开始使用