尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux下mkdir与cd:一条命令创建并进入指定目录

Linux下mkdir与cd:一条命令创建并进入指定目录 在 Linux 环境下干活几乎绕不开两件事建目录、进目录。mkdir和cd这俩命令看着简单却是日常操作里使用频率最高、也最容易在细节上翻车的组合。尤其当你需要在指定路径下一次性创建多层目录再快速切换进去时很多人会下意识敲一串命令结果却在路径写法、权限、目录是否已存在这些地方卡壳。这篇文章就是聊透“创建指定目录并进入”这件事。我会从路径的基本认知讲起把mkdir和cd的常用参数、使用场景、常见坑位全部过一遍最后给出我平时最推荐的一条命令组合方案。无论你是刚开始接触 Linux 的新手还是已经写了不少脚本的老手里面都有一些值得直接复制到.bashrc里用的思路。1. 先搞清楚你要从哪里出发工作目录与路径认知很多人在mkdir、cd上出错根子不在命令本身而是没搞懂“当前你在哪个目录”“目标路径怎么写”。把这两个问题想清楚后面所有的命令都顺了。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/myprojectmkdir常用的参数主要有这几个参数作用典型场景-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还支持用花括号展开的方式批量创建有规律的目录。这个功能很多人不知道但实际用起来非常提效。比如你现在要为一个项目创建标准目录结构包括docs、src、src/utils、testsmkdir -p project/{docs,src/utils,tests}命令执行后会生成这样的结构project/ ├── docs/ ├── src/ │ └── utils/ └── tests/花括号里可以用逗号分隔多个部分shell会自动展开成多个参数传给mkdir。还可以嵌套使用比如mkdir -p {src,tests}/{unit,integration}这会在src和tests下各建unit和integration两个目录。写这种命令之前建议先用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 返回上一步、回到主目录、切换到上次目录上面提到的几个快捷方式在实际操作里各有用途我梳理一下最常用的组合命令作用使用频率cd或cd ~回到当前用户主目录极高cd -在最近两个目录之间切换高cd ..回到上一级目录极高cd ../..回到上两级目录中cd ~/code进入主目录下的 code 目录高cd /切换到根目录低这里有个值得养成的习惯能用cd -就用cd -不要每次靠手打路径。cd -其实就是在维护一个“历史栈”shell 自动帮你记住了上一次的位置。很多资深 Linux 用户处理多目录事务时全靠cd -在两个位置之间反复横跳效率和准确性都比手打路径高。3.3 路径中带空格和特殊字符怎么处理目录名字里带空格是新手和脚本开发者最容易遇到的头疼问题。Linux 本身允许文件名带空格但 shell 默认用空格分隔参数这就产生了冲突。假如有一个目录叫my project files直接这样进cd my project filesshell 会把它拆成三个参数cd会报错找不到目录。正确的做法有两种。第一种是加反斜杠转义空格cd my\ project\ files第二种是把整个路径用引号包起来cd my project files实际使用中双引号方案更直观、更好读推荐优先使用。如果目录名里还有$、*、?等特殊字符也建议用双引号包住整个路径避免 shell 对里面的内容做变量替换或通配符展开。还有个相关的小技巧如果你不确定目录名怎么拼可以输入前几个字符然后按Tab键补全。shell 的自动补全会自动处理空格和特殊字符的转义这是最省心的做法。我在终端里基本很少手敲复杂路径一律依赖 Tab 补全既快又不容易出错。4. 把“创建并进入”变成一条命令讲完mkdir和cd各自的基础现在进入这篇文章的核心怎么把“创建指定目录并进入”这个高频操作从“两条命令”压缩成“一条命令”。4.1 用 alias 简化常用路径如果你频繁需要进入某个固定目录比如公司项目的代码库最快的方式是给cd写个别名alias projcd /home/rocky/code/myproject把这行写到~/.bashrc如果你用 zsh 就写到~/.zshrc然后执行source ~/.bashrc让它生效。以后只要敲proj就能直接进入项目目录。这个方法的适用范围很广日志目录、配置目录、备份目录只要是“固定位置频繁进入”的都值得设别名。别名的命名最好短一点且不要和已有命令冲突。设置之前可以先敲一下type 别名检查是否被占用。4.2 写一个 shell 函数 mkcd 的原理与实现比别名更进一步是在 shell 配置里定义一个函数把“创建目录并进入”两个动作合并起来。业界管这种函数叫mkcd或take是一个流传很广的实用技巧。在~/.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 权限的用户才能写入。处理起来按照这个顺序排查用ls -ld查看目标位置的权限ls -ld /var确认你对这个目录是否有写权限。如果确实没有权限有两种选择一是改用sudo mkdir -p 路径临时提升权限二是把目录建到用户主目录下~/。不要轻易给/根目录或其他系统目录执行chmod 777来“一劳永逸”这会破坏系统安全影响其他服务。生产环境里我一般会把需要写权限的目录建在用户有权限的挂载点或专用目录下而不是去硬写系统目录。如果服务要求必须用特定目录就通过systemd服务配置里的ReadWritePaths或容器挂载来解决而不是粗暴地改权限。5.3 目录名是数字开头、带空格、带中文怎么办目录名以数字开头完全没问题直接cd 123dir就能进入。但如果你有以减号开头的目录名比如-temp直接cd -temp会被当成参数解析报错。这时用--参数终止符cd -- -temp mkdir -- -temp对于带空格的目录用引号或 Tab 补全。对于中文目录名直接输入中文即可前提是系统 locale 设置正确。如果终端显示乱码检查一下LANG环境变量通常需要设为zh_CN.UTF-8或en_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 -p加cd的组合已经被我写进肌肉记忆了。日常交互操作用一个mkcd函数写脚本用mkdir -p 路径 cd 路径的强校验写法。这套组合拳可能会漏掉一些花哨的交互但从来没把目录建错过地方。Linux 里类似的“基础命令深挖”还有不少比如rm -rf的边界、cp的隐藏陷阱每一个都值得花时间弄清楚。用好这些基础命令比追求花哨工具更能决定你工作的下限。
返回列表