Linux终端入门之新建目录与文件
先问一句:你第一次打开Linux终端的时候,是不是对着黑乎乎的窗口发了好一阵呆?光标在那儿一闪一闪,好像等着你输入什么神秘的咒语。实际上它确实在等你输入——等你输入的第一批命令,多半逃不开两条:新建目录、新建文件。
终端里新建目录和文件,这个技能看似基础到不能再基础,但它其实是整个Linux操作体系的敲门砖。你不会mkdir和touch,后面所有的Linux常用命令、Shell脚本、系统配置,都会像没打地基的楼一样,盖不上去。会了之后,你会发现原来装系统、部署服务、写脚本那些看起来很唬人的操作,底层逻辑都绕不开“先建个目录放东西”、“先建个文件写配置”这两步。凡是打算认真把Linux当工具用的人——不管是后端开发、运维、嵌入式,还是刚把Linux装进虚拟机里打算折腾一下的新手——都值得把这块彻底吃透。
这篇东西我不打算写成那种翻来覆去念手册的教程,而是想以过来人的角度,把我在终端里建目录、建文件过程中踩过的坑、想明白的道理,一次性捋给你。
1. 为什么非要在终端里新建目录和文件
很多人会有疑惑:文件资源管理器里右键新建文件夹它不香吗?为什么非得在一个黑色窗口里敲命令?这个问题问得很好,答案也很直接:因为你迟早会遇到没有图形界面的场景,而且你在终端里新建目录和文件,从来不只是“为了建一个文件夹”,而是为了把后续操作嵌套进去。
1.1 终端操作的真实场景
最常见的场景是什么?远程登录一台服务器,不管是腾讯云、阿里云的轻量服务器,还是公司机房里的老旧机器,你手头只有一个SSH终端,没有桌面。这时候你需要在/home下新建一个项目目录,在里面再建几个子目录,放配置文件,写启动脚本——全程都是命令行操作。还有另一种场景:你想在服务器上部署一个应用,官方文档给你的第一步往往是“mkdir -p /opt/myapp && cd /opt/myapp”,你连这都看不懂,后面就别提了。
在这类场景里,终端操作不是可选项,是唯一选项。而且熟练之后你会发现,终端里“新建目录+新建文件”的效率,其实是高于鼠标的。比如你要一次性创建目录树project/{src,docs,scripts},鼠标要点好多下,终端里一条命令就搞定了。这不是炫技,是真的省时间。
1.2 先认清“当前目录”这个概念
新手在终端里最常犯的糊涂,是搞不清楚命令到底在哪里生效。你在终端里输入mkdir test,系统会在哪个地方创建这个test目录?答案是:在你的当前工作目录。这个目录就是终端提示符里通常会显示的那个路径。
你可以这样理解:每开一个终端窗口,你就相当于站在这台电脑文件系统中的某个位置上。你输入的命令,默认都是“站在当前位置操作当前脚下的东西”。想确认自己站在哪儿,输入pwd(print working directory,打印工作目录)。想看脚下有什么,输入ls。
这个理解非常关键,因为很多人第一次在终端里建完目录,跑到图形界面的“文件管理器”里死活找不到建出来的目录,原因就是两边的“位置”不是同一个。比如你在某个终端里位于/tmp/abc,但你的文件管理器打开的是~/Downloads,当然找不到。每个终端窗口的当前目录,就像你手里的一个定位光点——建目录这种命令,全看光点指在哪儿。
1.3 少用rm,多学ls
既然说到终端命令,必须先立一个规矩:在终端里操作文件和目录,一定要对危险命令有敬畏心。尤其是rm -rf这个组合,那可是真的有“一键送走全部数据”的本事。我见过不止一个新人,在练习新建目录和文件的阶段,突然上头,想试试删目录,结果把整个虚拟机的系统目录给删了,直接起不来。
所以我的建议是:练习阶段,你可以大胆地mkdir、touch,但rm这个命令,至少在头一个星期里,碰都别碰。真想清理,从安全一点的rmdir删空目录开始,等理解了绝对路径、相对路径、通配符的含义之后再碰rm。这个习惯可以帮你避开很多悔不当初的意外。
2. mkdir:新建目录的核心命令详解
mkdir 是 “make directory” 的缩写,直译就是“造一个目录”。这是你在Linux终端里学到的第一个命令级技能,用法本身不难,但里面有几个参数和逻辑,值得拆开说透。
2.1 mkdir基本用法:一次建一个目录
最基本的用法是mkdir [目录名]。比如当前目录下没有learn这个目录,你输入mkdir learn,按下回车,当前目录下就多了一个名为learn的空目录。想确认建没建成功,输入ls或者ls -l看一眼就行。
这里有个新手常见的问题:目录名能不能是中文?答案是可以,但我不推荐。终端环境、脚本编码、命令补全,遇到中文目录名很容易出现乱七八糟的问题。别给自己找事,目录名用英文小写字母加短杠是最稳的。比如my-project、linux_test这种。
另外一个常见问题是目录名能不能以点开头?比如.git、.config这种目录,以点开头的是隐藏目录,平时用ls看不到,要加ls -a才看得到。Linux里大量配置文件都是用点开头命名的,你以后多半会用到。现在记住这个知识点,后面能省不少排查时间。
2.2 -p参数:递归创建多级目录
mkdir最核心的参数是-p,全称是--parents,意思是“父级目录一并创建”。举个例子,你想一次性创建a/b/c这么一条三层目录结构,如果你先mkdir a,再mkdir a/b,再mkdir a/b/c,也不是不行,但效率太低,而且一旦遗漏某一级,后面的命令就报错。
这时候直接用mkdir -p a/b/c就够了,系统会自动把中间缺失的a、b目录都补上。就算a目录早就存在,命令也不会报错,直接跳过已存在的部分。
这个-p参数在后面的实践里几乎天天遇到。比如部署一个Java项目,你要经常建这样的目录结构:
mkdir -p /opt/myapp/{bin,conf,logs,data}这一条命令直接建出了4个目录。花括号{}是终端自带的扩展语法,叫花括号展开,它会自动把{bin,conf,logs,data}展开成四个名字,等价于四条mkdir命令。这个技巧在日常操作中效率极高,后面我会再多举几个例子。
2.3 -m参数:创建时直接指定权限
mkdir还有一个参数-m,用于创建目录的同时设置权限位。比如你要创建一个只对当前用户开放的私有目录,可以这样:
mkdir -m 700 private这个命令创建出的private目录,权限是700,也就是只有文件所有者能读写执行,同组用户和其他用户一概没权限。
新手可能对权限数字还很陌生,我用最简单的方式解释一下:Linux的权限用三位数字表示(比如755、700、644),第一位是“用户自己”,第二位是“同组人”,第三位是“其他人”。数字从0到7,代表读(4)、写(2)、执行(1)的加总。关于这个我多说一句:新手如果不是很清楚自己在做什么,尽量少用-m,用系统默认权限即可。默认权限已经考虑了安全和易用的平衡,等你理解了umask再自己控制不迟。
2.4 易错点:文件名带空格、特殊字符的处理
这个坑我几乎在每个人身上都见过。如果你在终端里输入mkdir my folder,注意my和folder之间加了一个空格,系统不会帮你创建名为“my folder”的目录,而是会创建两个各自独立的目录:一个叫my,另一个叫folder。
为什么会这样?因为终端默认用空格把参数切开的。一条命令中,每个被空格分隔的内容,都被当作一个独立的参数处理。想创建名字里带空格的目录,需要给整个名字加引号,或者用反斜杠转义,像这样:
mkdir "my folder" mkdir my\ folder我其实不建议你创建带空格的目录名,因为后面进入、操作、引用它的时候,每个地方都要小心翼翼地处理。但你必须知道这个原理,否则以后读到别人脚本里带引号的文件路径,会一头雾水。
目录名里也不要带像/、:这种特殊字符。/在Linux里是绝对路径的分隔符,你建目录时用了它,就相当于往下一层继续建了。想建a/b目录,至少要mkdir -p a/b才行,直接mkdir a/b会报“No such file or directory”,因为a不存在,系统不知道你要在哪里建b。
3. 新建文件的几种典型方法:touch命令与重定向
新建目录用mkdir,那新建文件呢?最常用的命令是touch。不过touch这个命令的“本来面目”其实不是建文件,而是更新文件的时间戳。你刚接触它,可以优先掌握它“顺手建文件”的用法,但背后的机制最好也了解一下,因为后面学着学着,你会发现它另一面特别有用。
3.1 touch命令:创建空文件的基础用法
touch的用法特别简单:
touch hello.txt这条命令会在当前目录下创建一个名为hello.txt的空文件。如果hello.txt已经存在,这行命令不会报错,也不会清空文件内容,只会把它的“最后修改时间”更新为当前时间。
这个特性在实战中挺有讲究。比如你想验证一个日志轮转机制是否生效,可以用touch把某个日志文件的修改时间改到日志轮转策略会认为它该被处理的状态,来测试系统行为。又比如你想建一堆占位文件来检测磁盘空间满时的系统表现,touch也是利器。所以别只把它当“创建空文件工具”,它的时间戳能力是独一份的。
创建一个文件之后,你可以用ls -l看它的详细信息。你会发现它的初始大小是0。这个细节很重要:Linux的文件创建和内容写入是两回事。touch只是把“文件目录项”建好了,内容还是空的。后续你得用echo、cat、vi/vim这些方式往里面写入内容。
3.2 重定向符号:用echo和cat直接写入内容
如果你不只是想建个空文件,还想顺便往里面写点字,推荐从小技巧开始记:用重定向。比如:
echo "hello linux" > hello.txt>的含意是“把左边命令的输出,覆盖写入右边的文件”。如果hello.txt不存在,系统会自动创建它。如果已经存在,会直接把内容覆盖掉。覆盖操作是不可逆的,原内容会瞬间消失。
如果你还想保留原有内容,在后面追加新内容,用>>:
echo "another line" >> hello.txt这个追加操作在日常操作里太常用了,比如往配置文件末尾补一行内容,或者把某条命令的运行结果存进日志文件:
ls -l >> file_list.txt注意,不管是用>还是>>,如果目标文件的老目录不存在,系统都会报错。所以新建文件前,通常要先用mkdir把目录结构安排好,或者确保当前目录正确。这个先后顺序也是后面综合实战的核心思路。
3.3 vi/vim:想编辑文件内容时的正确选择
touch建空文件,echo写简单内容,但如果要写稍微复杂一点的文本——比如一段配置、几行代码、一份说明文档——再用echo就太难受了。终端的编辑器,常见的vi/vim或者nano,才是正选。
新手可以先从nano开始,因为它的操作模式更符合直觉。nano file.txt进入编辑器,直接打字,写完按住Ctrl+X,按提示输入Y确认保存,再按回车退出,完事。
vim虽然功能更强大,但它的模式切换(普通模式、插入模式、命令行模式)对新手的理解成本略高。不过我得说,vim你在Linux这条路上迟早要掌握,很多服务器上根本没有nano,但几乎都有vim。我的建议是:先用nano把前面的命令熟悉起来,等你对i进入插入模式、Esc退出、:进入命令模式、w保存、q退出这些基础操作形成肌肉记忆后,再过渡到vim。这个过程不用急,熟能生巧。
3.4 适合新手的三个文件练习
学完touch、echo、重定向、nano之后,我建议你立刻做一组小练习,把这几个操作串起来:
第一步,在终端里mkdir -p /tmp/training/{docs,scripts}建立训练目录。
第二步,cd /tmp/training/docs进入文档目录,用touch readme.txt创建一个空文档,再用echo "study log" >> readme.txt写入一行内容。
第三步,cd ../scripts进入脚本目录,用nano建一个简单的hello.sh。内容可以只写一行echo "hello from shell"。
第四步,回到/tmp/training,执行两个查看命令:ls -R看整体目录树,以及cat docs/readme.txt确认文件内容已经写入了。
这套练习做完,你基本就把“在终端里建目录、在目录里建文件、往文件里写内容、查看结果”这条链路完整走了一遍,它也是之后所有终端操作的基础框架。
4. 综合实战:从零搭起一个项目的目录结构
只学会单个命令还不够,你得学会组合使用,才会真切体会到“终端操作真方便”。这一节我会带你把前面学的命令串起来,模拟一次真实的项目初始化。核心场景是:你收到一个任务,要在服务器上搭建一个新服务的目录骨架,并创建几个基本的说明文件和配置文件。
4.1 一次性搭出项目目录树
假设产品叫order-service,你希望它的目录结构是这样的:
/opt/order-service/ ├── bin/ # 放可执行脚本 ├── conf/ # 放配置文件 ├── logs/ # 放运行日志 └── data/ # 放业务数据最简单的方式就是把之前说过的那条mkdir -p命令派上用场:
sudo mkdir -p /opt/order-service/{bin,conf,logs,data}这里用sudo是因为/opt目录默认归root所有,普通账号没有写入权限。新手请记住这个判断流程:当系统报Permission denied时,第一反应检查你对目标目录有没有操作权限,而不是只看命令本身对不对。
创建之后,用tree命令查看目录树最直观。如果你的系统没有tree,可以用find /opt/order-service -type d代替,或者退一步用ls -R /opt/order-service。
4.2 填充关键文件:配置、脚本与说明文档
目录建好之后,开始往里面填充文件。这一步正好把touch、echo、cat、nano全部用上。
先在conf里放一个最基础的配置文件。假设你是给一个Java服务准备配置,可以用nano创建nano /opt/order-service/conf/app.yml,写入类似下面的内容:
server: port: 8080 mode: dev log: level: info保存退出。接着给bin目录放一个启动脚本雏形。用nano创建/opt/order-service/bin/start.sh:
#!/bin/bash echo "order-service starting..." cd /opt/order-service # 实际项目里,这里会放真正的启动命令,比如 java -jar xxx.jar然后给它执行权限:
chmod +x /opt/order-service/bin/start.sh这一步是因为Linux下的脚本文件默认没有执行位,创建完通常要用chmod改变文件权限,不然运行的时候会报Permission denied。
最后在根目录放一个README.md说明文件。这里演示用一行命令生成初始内容:
echo "# order-service" > /opt/order-service/README.md然后需要追加说明的时候,再配合>>补充。比如:
echo "created for deployment practice" >> /opt/order-service/README.md到这一步,你已经完成了比单纯“新建目录和文件”稍微进阶一步的完整实践:用mkdir预规划结构、用nano写内容、用chmod调权限、用echo进行快速初始化和追加写入。
4.3 快速验证成果并留下“操作日志”
一个我特别想强调的习惯,是在每一步操作过程中及时验证。封装的目录建好之后,多敲几下ls -l、cat去检查,因为“确认一步,再走下一步”是终端操作里避免连锁错误的黄金准则。
你可以用一组命令快速验证这次全部操作:
ls -lR /opt/order-service结果会清晰显示目录层级和每个文件的权限、大小。如果你愿意,还可以把验证结果存下来留作记录:
ls -lR /opt/order-service > structure_snapshot.txt这又会用一次重定向。你看,这些命令就是这么反复串来串去的,越串你越会觉得顺手。
5. 常见问题与排查技巧实录
建目录和文件看着不难,但实际操作中遇到的报错和困惑,那是五花八门。我把这些年见到的高频问题整理成了一只参考速查表,你们遇到类似情况,可以直接对着排查。
5.1 Permission denied:没有操作权限怎么办
这个报错的信息往往是mkdir: cannot create directory ‘xxx’: Permission denied。原因很简单,你对当前所在的目录没有写权限。最常见的场景是你在/根目录或者/etc、/usr这类系统目录下想直接建目录,而这些地方普通用户是不能改动的。
解决方法有三个:第一,回到自己有权限的目录,比如自己的家目录~或/tmp,直接创建;第二,在命令前面加sudo提权,但你需要知道sudo密码并且明白自己在做什么;第三,用cd切换到一个你确定有写权限的目录再继续。
这里要说个贴心提醒:日常练习就老老实实在自己的家目录下搞,别一上来就sudo到处建目录,万一在系统目录里建了乱七八糟的结构,后面清理起来极麻烦,还可能破坏系统默认配置。
5.2 No such file or directory:父目录不存在
报错信息形如mkdir: cannot create directory ‘a/b’: No such file or directory,问题根源在于父目录a不存在。你把命令改成mkdir -p a/b即可解决,这也是大家一直强调-p参数的实战价值。新建文件也同理:如果你想vim /opt/project/conf/app.yml,但conf目录还不存在,vim会报错而不是自动创建目录。你得先mkdir -p /opt/project/conf,再进去建文件。
5.3 文件名或目录名带空格的处理
前面提过,比较安全的策略是根本不建带空格的目录名。但如果你拿到一个已经存在的带空格目录,比如My Documents,想进入或新建文件怎么办?两种办法:整个路径加引号cd "My Documents",或者用反斜杠转义空格cd My\ Documents。
还有一个排查方向值得注意:你明明输入的是mkdir my folder,结果ls一看出现了两个目录my和folder,别觉得奇怪,按连接终端的原理去理解就行。以后写脚本的时候,凡是涉及路径变量,都记得加引号包起来,防止路径里的空格拆散参数。
5.4 Tab键补全:避免手滑和路径错误的最佳习惯
这是一条操作经验,算不上问题,但我必须放在这里重点说:在终端里,时刻养成按Tab键补全的习惯。输入目录名的前半段,按一下Tab,系统会自动补全。如果有多个匹配,再按两下Tab会列出候选列表。这不仅能防手滑,还能避免因为敲错一个字母导致的各种奇怪报错。
我观察过很多新手操作,慢的最大原因之一就是全程手打完整路径,又费力又容易出错。真正干活顺手的人,输入命令时都是靠Tab一路点过去的,又快又准。这个习惯从入门第一天就该养成。
说到这里,我把这节内容集中成一张速查表,方便各位对照参考:
| 操作目的 | 常用命令 | 关键注意点 |
|---|---|---|
| 查看当前位置 | pwd | 判断当前在哪个目录 |
| 查看目录内容 | ls/ls -l/ls -a | -a能看到隐藏目录 |
| 新建单级目录 | mkdir dirname | 目标位置必须有写权限 |
| 新建多级目录 | mkdir -p a/b/c | -p自动补父级目录 |
| 新建带权限目录 | mkdir -m 700 private | 数字权限按读4写2执行1相加 |
| 新建空文件 | touch file.txt | 文件已存在时更新时间戳 |
| 写入/覆盖内容 | echo "xx" > file.txt | >覆盖原内容,不可逆 |
| 追加内容 | echo "xx" >> file.txt | >>保留原内容追加 |
| 编辑文件 | nano file.txt/vim file.txt | nano适合新手,vim更通用 |
| 查看文件内容 | cat file.txt | 适合短小文本文件 |
| 递归查看整棵树 | ls -R dirname | 目录层级多时比较直观 |
| 修改文件权限 | chmod +x file.sh | 脚本文件通常要加执行权限 |
6. 把这些命令练成本能之后,你能走得更远
很多人以为学会mkdir和touch就结束了,其实恰恰相反,这两个基础操作是你进入Linux终端世界的第一道门。跨过这道门之后,你会发现前面学到的很多东西会继续复用。
比如你想写一个自动化部署脚本,第一步一定是判断目录是否存在、不存在就mkdir -p创建;你要搭建一套日志收集机制,第一步就是touch一个文件作为日志载体;你想往系统里添加一个服务,第一步就是建一个专门的应用目录。可以说,后面所有进阶操作,都会反复踏足“先建目录、再建文件、再写内容”这个老三步。
顺着这个方向,我建议你接下来可以逐步接触这些相关技能:
一是相对路径和绝对路径的频繁切换。你会经常需要判断当前位置,要理解..表示上一级目录、.表示当前目录,以及cd -可以快速回到上一次所在目录。这套路径思维是终端高效操作的地基。
二是文件和目录的复制、移动与删除。等对文件安全有了足够认识之后,学cp、mv、rm的时候要格外沉稳,每一步都确认清楚路径再执行。
三是查看命令帮助。遇到不认识的命令或参数,最高效的求助方式是man 命令名或命令名 --help。这比到处搜索更直接,而且能帮你建立自己的知识索引。
四是终端复用工具。等你开始频繁操作多台服务器或者同时处理多个任务时,像tmux这样的终端复用器会成为效率神器。它能让你在一个终端窗口里开多个面板,一个建目录一个编辑文件一个看日志,互不干扰,整个操作流会痛快很多。
五是shell脚本的初步编写。当你觉得在终端里手动输入mkdir、touch、echo越来越熟练时,就可以试着把它们写进一个.sh脚本里,用变量、循环、判断把它们组织成有逻辑的工作流。到那时候,你已经不是“在终端里敲命令”,而是“让终端为你干活”了。
我个人在实际操作中最大的体会是:终端操作能力不是背出来的,而是在反复的“敲错、报错、排查、修正”循环里练出来的。新建目录和文件作为最初级的操作,恰恰是试错成本最低的练习场——你随便建,建错了大不了删掉重来,不存在什么不可恢复的风险(当然,前提是别碰rm-rf)。所以,看到这里,你在自己的Linux虚拟机或者云服务器上,找个目录,把上面那些练习一个一个敲一遍。手敲过一遍的和只是看过的,完全不是一个掌握深度。
最后再分享一个小技巧:当你以后在一个陌生的服务器上不知道目录结构怎么放的时候,先停手想一想——如果我自己设计,目录怎么分层?然后大胆地用mkdir -p搭出一个结构来。等你拆解过的项目多了,慢慢就会形成“看到需求就能搭出合理目录结构”的直觉。这个直觉,就是从你现在敲下第一句mkdir开始积累的。