Linux下mkdir与cd:一条命令创建并进入指定目录
2026/9/11 1:58:45 网站建设 项目流程

在 Linux 环境下干活,几乎绕不开两件事:建目录、进目录。mkdircd这俩命令,看着简单,却是日常操作里使用频率最高、也最容易在细节上翻车的组合。尤其当你需要在指定路径下一次性创建多层目录,再快速切换进去时,很多人会下意识敲一串命令,结果却在路径写法、权限、目录是否已存在这些地方卡壳。

这篇文章就是聊透“创建指定目录并进入”这件事。我会从路径的基本认知讲起,把mkdircd的常用参数、使用场景、常见坑位全部过一遍,最后给出我平时最推荐的一条命令组合方案。无论你是刚开始接触 Linux 的新手,还是已经写了不少脚本的老手,里面都有一些值得直接复制到.bashrc里用的思路。

1. 先搞清楚你要从哪里出发:工作目录与路径认知

很多人在mkdircd上出错,根子不在命令本身,而是没搞懂“当前你在哪个目录”“目标路径怎么写”。把这两个问题想清楚,后面所有的命令都顺了。

1.1 你站在哪儿:pwd 与工作目录的概念

Linux 的 shell 里,每条命令都默认在一个“当前工作目录”下执行。你打开终端的那一刻,通常落在自己的用户主目录,也就是/home/用户名。但这个位置并不是固定不变的,你用cd切换过目录之后,当前工作目录就变了。

想知道自己此刻站在哪,用pwd命令:

pwd

输出会告诉你完整的绝对路径,比如/home/rocky/var/log。我见过太多人上来就mkdir -p a/b/c,结果命令执行成功,却找不到目录建到哪儿了。这种情况十有八九是没先确认当前目录,最后在错误的位置建了文件夹。

所以我的建议是:凡是涉及到“指定目录”的操作,第一件事永远是pwd确认当前位置。这个习惯看着笨,但能帮你避掉大量路径混乱的问题。

1.2 绝对路径和相对路径:两条路线,一个终点

理解了工作目录,接着要分清两种路径写法。

  • 绝对路径:从根目录/开始写全,例如/home/rocky/projects/web。无论当前在哪,这条路径指向的都是同一个地方。
  • 相对路径:从当前目录开始写,例如projects/web或者../docs。同样的写法,换一个当前目录,含义就完全不同。

我给你举个很典型的例子。假设当前目录是/home/rocky,你想在/tmp下建一个名为test的目录:

mkdir /tmp/test # 绝对路径,肯定建在 /tmp 下 mkdir test # 相对路径,建在 /home/rocky 下

两条命令都合法,结果却南辕北辙。当你跟别人协作、写脚本的时候,我强烈建议关键路径全部使用绝对路径,或者在命令开头先cd到目标位置,再执行mkdir。这样即使环境变化,也不会建错地方。

路径里有两个特殊符号值得单独记一下:.代表当前目录,..代表上一级目录。这两个符号在cd的时候用得非常频繁,后面我会专门讲。

2. mkdir 创建目录:看似简单,坑却不少

mkdir的全称是 make directory,功能就是创建目录。但“创建目录”这四个字背后,藏了很多细节:多层目录怎么建、目录已存在怎么办、权限位怎么设置、一次建多个目录的行不行。

2.1 mkdir 的基本用法与常用参数

最基本的用法就是后面跟目录名:

mkdir myproject

这条命令会在当前目录下创建一个名为myproject的目录。如果你想在指定位置创建,就写完整路径:

mkdir /home/rocky/code/myproject

mkdir常用的参数主要有这几个:

参数作用典型场景
-p递归创建父目录,父目录不存在时自动创建mkdir -p a/b/c,一次建多层
-v显示创建过程调试、确认创建了哪些目录
-m创建时指定目录权限mkdir -m 700 secret创建私有目录
--结束选项标记创建名字以-开头的目录时使用

有个冷门技巧:mkdir还能一次创建多个平级目录,只要在后面跟多个名字就行:

mkdir project1 project2 project3

这会一次建三个互不嵌套的目录。批量建目录的时候很好用,不用写三条命令。

2.2 为什么推荐 mkdir -p:嵌套目录与幂等性

新手最容易踩的坑,是在父目录不存在的情况下直接建子目录。比如你想建/home/rocky/projects/web,但projects目录还不存在:

mkdir projects/web

这时候系统会报错:mkdir: cannot create directory 'projects/web': No such file or directory

报错的原因是mkdir默认只有在父目录存在时才能创建子目录。解决办法有两种:先建父目录再建子目录,或者直接用-p参数一步到位:

mkdir -p projects/web

加上-p之后,mkdir会自动创建路径中缺失的所有父目录。这个方法还有一个非常重要的特性——幂等性。如果目录已经存在,mkdir -p不会报错,而是静默退出,退出码为 0。而普通mkdir在目录已存在时会报File exists

这个差异在脚本里极其重要。举个例子,你写一个部署脚本,每次执行都要确保/var/www/html存在。用普通mkdir,第二次执行就会失败;用mkdir -p /var/www/html,无论执行多少遍都安全。我在自己写的所有自动化脚本里,涉及到目录创建的地方,一律用mkdir -p,目的就是保平安。

2.3 一次创建多个目录的实用技巧

除了多级嵌套目录,mkdir还支持用花括号展开的方式批量创建有规律的目录。这个功能很多人不知道,但实际用起来非常提效。

比如你现在要为一个项目创建标准目录结构,包括docssrcsrc/utilstests

mkdir -p project/{docs,src/utils,tests}

命令执行后,会生成这样的结构:

project/ ├── docs/ ├── src/ │ └── utils/ └── tests/

花括号里可以用逗号分隔多个部分,shell会自动展开成多个参数传给mkdir。还可以嵌套使用,比如:

mkdir -p {src,tests}/{unit,integration}

这会在srctests下各建unitintegration两个目录。写这种命令之前,建议先用echo看一下展开结果:

echo {src,tests}/{unit,integration}

输出应该是src/unit src/integration tests/unit tests/integration,确认无误后再执行mkdir。这种方法非常适合初始化项目骨架,一条命令就把目录结构搭好了。

3. cd 进入目录:shell 里最频繁的操作

目录建好之后,下一步就是进入它。cd是 change directory 的缩写,基本用法就是cd 目录路径。但这个命令也有一些快捷方式和注意事项,掌握之后能明显提升操作效率。

3.1 cd 的多种写法与快捷键

cd后面可以跟绝对路径,也可以跟相对路径:

cd /etc/nginx # 绝对路径 cd ../myproject # 相对路径 cd ~/code # 波浪号代表用户主目录 cd . # 留在当前目录(没啥用,但合法)

如果你什么都不跟,直接敲cd,会回到当前用户的主目录。这相当于cd ~,是从任意位置快速回主目录的最简单方法。

cd还有一种写法值得专门记一下:cd -。这条命令会切换到“上一个工作目录”,并在屏幕上打印出这次切换的位置。它在两个目录之间来回切换时特别好使。

假设你当前在/var/log,想临时回自己目录看个文件,然后马上回到/var/log继续干活:

cd ~ # 干完自己的事之后 cd -

cd -一下就能跳回去,不需要把手长长的路径再敲一遍。我在排查日志的时候经常这样来回切,省下的时间看着不多,但胜在不用打断思路。

3.2 返回上一步、回到主目录、切换到上次目录

上面提到的几个快捷方式,在实际操作里各有用途,我梳理一下最常用的组合:

命令作用使用频率
cdcd ~回到当前用户主目录极高
cd -在最近两个目录之间切换
cd ..回到上一级目录极高
cd ../..回到上两级目录
cd ~/code进入主目录下的 code 目录
cd /切换到根目录

这里有个值得养成的习惯:能用cd -就用cd -,不要每次靠手打路径。cd -其实就是在维护一个“历史栈”,shell 自动帮你记住了上一次的位置。很多资深 Linux 用户处理多目录事务时,全靠cd -在两个位置之间反复横跳,效率和准确性都比手打路径高。

3.3 路径中带空格和特殊字符怎么处理

目录名字里带空格,是新手和脚本开发者最容易遇到的头疼问题。Linux 本身允许文件名带空格,但 shell 默认用空格分隔参数,这就产生了冲突。

假如有一个目录叫my project files,直接这样进:

cd my project files

shell 会把它拆成三个参数,cd会报错找不到目录。正确的做法有两种。

第一种是加反斜杠转义空格:

cd my\ project\ files

第二种是把整个路径用引号包起来:

cd "my project files"

实际使用中,双引号方案更直观、更好读,推荐优先使用。如果目录名里还有$*?等特殊字符,也建议用双引号包住整个路径,避免 shell 对里面的内容做变量替换或通配符展开。

还有个相关的小技巧:如果你不确定目录名怎么拼,可以输入前几个字符然后按Tab键补全。shell 的自动补全会自动处理空格和特殊字符的转义,这是最省心的做法。我在终端里基本很少手敲复杂路径,一律依赖 Tab 补全,既快又不容易出错。

4. 把“创建并进入”变成一条命令

讲完mkdircd各自的基础,现在进入这篇文章的核心:怎么把“创建指定目录并进入”这个高频操作,从“两条命令”压缩成“一条命令”。

4.1 用 alias 简化常用路径

如果你频繁需要进入某个固定目录,比如公司项目的代码库,最快的方式是给cd写个别名:

alias proj='cd /home/rocky/code/myproject'

把这行写到~/.bashrc(如果你用 zsh 就写到~/.zshrc),然后执行source ~/.bashrc让它生效。以后只要敲proj,就能直接进入项目目录。

这个方法的适用范围很广:日志目录、配置目录、备份目录,只要是“固定位置频繁进入”的,都值得设别名。别名的命名最好短一点,且不要和已有命令冲突。设置之前可以先敲一下type 别名检查是否被占用。

4.2 写一个 shell 函数 mkcd 的原理与实现

比别名更进一步,是在 shell 配置里定义一个函数,把“创建目录并进入”两个动作合并起来。业界管这种函数叫mkcdtake,是一个流传很广的实用技巧。

~/.bashrc~/.zshrc里加上这样一段:

mkcd() { mkdir -p "$1" cd "$1" || return }

保存后执行source ~/.bashrc。以后你就可以这样用:

mkcd /home/rocky/projects/website

命令执行后,目录会被自动创建(包括所有缺失的父目录),然后你的当前目录会直接切换到新创建的目录里。整个过程一步完成,不用再手动串两条命令。

这个函数有两个关键点值得说明。第一,用了mkdir -p而不是普通mkdir,所以无论目录是否存在,命令都安全,不会报错。第二,cd "$1" || return这半句的作用是:如果当前目录创建失败或者 cd 失败,函数会带着错误码退出,不会继续往下执行,避免脚本在错误状态下继续跑。

如果你的 shell 是 zsh,自己已经内置了类似功能。zsh 的autocd选项开启后,直接输入目录路径就能进去,不需要敲cd。但mkdir -p && cd这个动作依然没有一个原生命令能一步完成,所以在 zsh 里加这个函数依然值得。

4.3 一键脚本:目录存在时直接进入

mkcd函数已经能覆盖绝大部分需求,但我在实际使用时发现一个可以再优化的点:当目标目录已经存在时,mkdir -p是静默通过的,这时函数不会提示任何信息,直接就切进去了。这在交互操作中没问题,但如果想要更清晰的反馈,可以把函数升级得更“有感知”一点:

mkcd() { if [ -d "$1" ]; then echo "目录已存在,直接进入: $1" else echo "正在创建目录: $1" mkdir -p "$1" fi cd "$1" || return }

这样执行时,你会看到“创建”还是“进入”的明确反馈。在验证脚本逻辑、排查问题时特别有用。这种带反馈的版本,我自己更常用。

如果你要在多台机器上维护这套配置,我建议把mkcd、常用的alias、以及自定义的PS1提示符都放在一个独立配置文件里(比如~/.shell_aliases),然后在.bashrc里用source ~/.shell_aliases引入。这样换新机器时,只需拷贝一个配置文件的成本,就能把你沉淀的全部操作习惯带过去。

5. 常见问题与排查技巧实录

最后这部分,我把实际操作中遇到的高频问题集中整理一下。很多问题不影响命令执行,但会影响后续操作,或者让你的脚本在别的机器上莫名其妙挂掉。

5.1 报错 File exists 是什么情况

普通mkdir在目标已存在时会报错:

mkdir: cannot create directory 'myproject': File exists

这不是什么大问题,但如果你把这行命令写进脚本,脚本很可能因为这一句就中断执行,尤其是有set -e的脚本,会直接退出。

解决方案就一句话:凡是可能反复执行的创建操作,一律改用mkdir -p-p参数保证了操作是幂等的——目录不存在就创建,已存在就跳过,不报错、不中断。这是我在所有自动化脚本里坚持使用的写法。

5.2 Permission denied 权限不够怎么排查

创建目录时出现:

mkdir: cannot create directory 'xxx': Permission denied

这说明当前用户没有目标位置的写权限。典型场景是在//var下建目录,而这些位置通常只有 root 或具有 sudo 权限的用户才能写入。

处理起来按照这个顺序排查:

  1. ls -ld查看目标位置的权限:ls -ld /var,确认你对这个目录是否有写权限。
  2. 如果确实没有权限,有两种选择:一是改用sudo mkdir -p 路径临时提升权限;二是把目录建到用户主目录下~/
  3. 不要轻易给/根目录或其他系统目录执行chmod 777来“一劳永逸”,这会破坏系统安全,影响其他服务。

生产环境里,我一般会把需要写权限的目录建在用户有权限的挂载点或专用目录下,而不是去硬写系统目录。如果服务要求必须用特定目录,就通过systemd服务配置里的ReadWritePaths或容器挂载来解决,而不是粗暴地改权限。

5.3 目录名是数字开头、带空格、带中文怎么办

目录名以数字开头完全没问题,直接cd 123dir就能进入。但如果你有以减号开头的目录名,比如-temp,直接cd -temp会被当成参数解析,报错。这时用--参数终止符:

cd -- -temp mkdir -- -temp

对于带空格的目录,用引号或 Tab 补全。对于中文目录名,直接输入中文即可,前提是系统 locale 设置正确。如果终端显示乱码,检查一下LANG环境变量,通常需要设为zh_CN.UTF-8en_US.UTF-8之类含 UTF-8 的值:

echo $LANG

如果服务器上因为 locale 缺失显示不了中文名,可以用tab键补全,也能正确生成文件名,只是显示上可能是转义形式。

5.4 在脚本里写 mkdir 和 cd,有个隐含坑必须提醒

这是本文最后一个提醒,也是我在 code review 中经常发现的问题。脚本里很多人会写这样的代码:

cd /some/dir mkdir subdir

这里隐藏了一个风险:如果cd /some/dir失败(目录不存在、权限不足),脚本不会停下,会继续在当前目录里执行mkdir subdir,然后在完全错误的位置创建目录。这个 bug 极难排查,因为脚本本身不报错,只有后续逻辑表现异常。

稳妥的写法是把cd和后续命令用逻辑符连接:

cd /some/dir || exit 1 mkdir -p subdir

或者用我们前面讲的mkcd思想:

mkdir -p /some/dir/subdir && cd /some/dir/subdir

这样一来,前置操作只要失败,后续步骤就不会执行。写自动化脚本时,这就是保命的一行。

从我个人的使用习惯来说,mkdir -pcd的组合已经被我写进肌肉记忆了。日常交互操作用一个mkcd函数,写脚本用mkdir -p 路径 && cd 路径的强校验写法。这套组合拳,可能会漏掉一些花哨的交互,但从来没把目录建错过地方。Linux 里类似的“基础命令深挖”还有不少,比如rm -rf的边界、cp的隐藏陷阱,每一个都值得花时间弄清楚。用好这些基础命令,比追求花哨工具更能决定你工作的下限。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询