🌱代码仓库:MSTcheng · Gitee
《数据结构》
《算法学习》
《C++由浅入深》
《Linux操作系统》
前言:上一篇文章我们向大家介绍了一部分Linux的基础指令,以及一些周边话题。本篇文章我们就来向大家介绍一下剩余的基本指令。
一、mkdir与rm指令
1.mkdir -p:一次创建一串路径
- “创建一串路径。”
- 演示:
stcheng@ubuntu-dev:~/117/code$ ll total48drwxrwxr-x7mstcheng mstcheng4096Aug2814:18 ./ drwxrwxr-x4mstcheng mstcheng4096Feb112026../ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ -rwxrwxr-x1mstcheng mstcheng15952Aug2421:23 code.exe* drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/ mstcheng@ubuntu-dev:~/117/code$mkdir-pa/b/c/d mstcheng@ubuntu-dev:~/117/code$ ll total52drwxrwxr-x8mstcheng mstcheng4096Aug2814:18 ./ drwxrwxr-x4mstcheng mstcheng4096Feb112026../ drwxrwxr-x3mstcheng mstcheng4096Aug2814:18 a/ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ -rwxrwxr-x1mstcheng mstcheng15952Aug2421:23 code.exe* drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/ //这里我们可以看到创建的是一个多级目录! tree命令后面会介绍! mstcheng@ubuntu-dev:~/117/code$ tree ./a ./a └── b └── c └── d4directories,0files-p表示递归创建:如果a、a/b、a/b/c都不存在,会一次性全部创建出来。- 没有
-p时,父目录不存在会报错cannot create directory ... No such file or directory。 - 注意:需要一次建多级目录时,必须加
-p,这是最容易忘的参数。
2.rm:删除文件
rm命令可以同时删除文件或目录- 语法:
rm [-f-i-r-v] [dirName/dir] - 适用对象:所有使用者
- 功能:删除文件或目录
- 常用选项:
•-f即使文件属性为只读(即写保护),亦直接删除
•-i删除前逐⼀询问确认
•-r删除目录及其下所文件
mstcheng@ubuntu-dev:~/117/code$rm./a rm: 无法删除'./a':是一个目录 //带上-r选项就能将目录进行删除! mstcheng@ubuntu-dev:~/117/code$rm-r./a“rm:目录。”,意思就是"rm它是个目录")
学了这么多命令特别是哪些带参数的命令,什么
-a啊,-l啊,-p啊等等这些参数我们不可能全部记住,但是可以通过一个命令来查看——man命令!
二、man命令
- 语法:
man [选项]命令 - 常用选项:
•-k按关键字搜索联机帮助
•num只在第 num 章节查找(如man 1 xxx查第一章,man 2 xxx查第二章)
•-a显示所有章节:默认从第一章搜到即停,加-a后按q退出会继续往后搜索,直到全部章节搜完
使用姿势
查某个命令的手册:
man 指令名,例如man ls,man printf。指定章节查看:
man 2 某函数看系统调用、man 3 某函数看库函数。- 因为有些词在多个章节都有(比如
open、printf),用man 章节号 名字可以精确查。
- 因为有些词在多个章节都有(比如
在 man 界面里:
/关键字搜索、q退出。演示:
mstcheng@ubuntu-dev:~/117/code$manprintf# printf也是一个指令!mstcheng@ubuntu-dev:~/117/code$man2printf在第2节中没有关于printf的手册页条目。 mstcheng@ubuntu-dev:~/117/code$man3printf# 查看C库函数mstcheng@ubuntu-dev:~/117/code$manfork# 查看系统调⽤,默认没有这个指令,man就⾃动- 查出来的手册大概长这样:
注意:
man手册分为9章(不同系统可能会有差别)
Linux 手册章节对照表
| 章节 | 内容 | 说明 |
|---|---|---|
| 1 | Executable programs or shell commands | 可执行程序 /shell 命令(最常用) |
| 2 | System calls | 系统调用(由内核提供) |
| 3 | Library calls | 库函数(程序库中的函数) |
| 4 | Special files | 特殊文件(通常位于/dev,如设备文件) |
| 5 | File formats and conventions | 文件格式与约定,例如/etc/passwd |
| 6 | Games | 游戏 |
| 7 | Miscellaneous | 杂项(含宏包和约定),如man(7)、groff(7) |
| 8 | System administration commands | 系统管理命令(通常只有 root使用) |
| 9 | Kernel routines | 内核例程 |
三、cp指令
- 语法:
cp [选项]源文件或目录 目标文件或目录 - 功能:复制文件或目录
- 说明:
•cp用于复制文件或目录
• 若指定多个源且目标是已存在的目录,则把所有源复制到该目录中
•-f或-force强行复制文件目录, 不论目的文件或目录是否已经存在
•-i或-interactive覆盖文件之前先询问用户
•-r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理
mstcheng@ubuntu-dev:~/117/code$ ll total48drwxrwxr-x7mstcheng mstcheng4096Aug2814:20 ./ drwxrwxr-x4mstcheng mstcheng4096Feb112026../ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ -rwxrwxr-x1mstcheng mstcheng15952Aug2421:23 code.exe* drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/ mstcheng@ubuntu-dev:~/117/code$mkdirtest# 在当前目录下创建一个test 目录mstcheng@ubuntu-dev:~/117/code$cd..# 回到上级目录#拷贝~/117/code 下的test目录 到~/117下 ./code/test(目标文件/目录) ./ (目标目录下)mstcheng@ubuntu-dev:~/117$cp-r./code/test ./ mstcheng@ubuntu-dev:~/117$ ll total20drwxrwxr-x5mstcheng mstcheng4096Aug2815:02 ./ drwxr-x---35mstcheng mstcheng4096Aug2815:00../ drwxrwxr-x8mstcheng mstcheng4096Aug2815:02 code/ drwxrwxr-x4mstcheng mstcheng4096Feb242026process_code/ drwxrwxr-x2mstcheng mstcheng4096Aug2815:02 test/四、mv指令
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files,经常用来备份文件或者目录
语法:mv [选项]源文件或目录 目标文件或目录
- 第二个参数是文件→ 重命名;是目录→ 移动。
- 目标是文件时,源只能有一个,将其重命名为目标文件名。
- 目标是已存在的目录时,源文件可有多个,全部移入该目录。
- 演示:
mstcheng@ubuntu-dev:~/117/code$ ll total52drwxrwxr-x8mstcheng mstcheng4096Aug2815:02 ./ drwxrwxr-x5mstcheng mstcheng4096Aug2815:02../ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ -rwxrwxr-x1mstcheng mstcheng15952Aug2421:23 code.exe* drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Aug2815:02 test/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/ mstcheng@ubuntu-dev:~/117/code$ tree ./test ./test0directories,0files //将code.exe文件移动到当前目录下的test子目录里 mstcheng@ubuntu-dev:~/117/code$mvcode.exe ./test //此时就会发现刚刚在code这个目录下的code.exe 被移动到了test目录下 mstcheng@ubuntu-dev:~/117/code$ tree ./test ./test └── code.exe1directory,1filemstcheng@ubuntu-dev:~/117/code$ ll total36drwxrwxr-x8mstcheng mstcheng4096Aug2918:06 ./ drwxrwxr-x5mstcheng mstcheng4096Aug2815:02../ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Aug2918:06 test/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/ //将当前目录下的test目录改名为 test1 因为test1不存在所以使用mv就是改名! mstcheng@ubuntu-dev:~/117/code$mv./test test1 mstcheng@ubuntu-dev:~/117/code$ ll total36drwxrwxr-x8mstcheng mstcheng4096Aug2918:11 ./ drwxrwxr-x5mstcheng mstcheng4096Aug2815:02../ drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest/ drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code/ drwxrwxr-x2mstcheng mstcheng4096Oct282025list/ -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar/ drwxrwxr-x2mstcheng mstcheng4096Aug2918:06 test1/ drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode/
mv olddir newdir并不会创建新的 inode(不会新建目录本体),只是在父目录的目录项里新增一条「新名字」,指向原来旧目录的 inode,然后删掉旧名字那条目录项。全程没有数据拷贝。
五、tree指令
tree命令以树状结构列出目录下的所有内容,包括子目录和文件,一目了然。- 语法:
tree [选项] [目录] - 适用对象:所有使用者
- 功能:以树状图列出目录的内容
- 常用选项:
•-a显示所有文件和目录(默认会隐藏以.开头的文件
•-d只显示目录,不显示文件
•-L限制显示的层级深度,例如tree -L 2只显示两层
•-f显示完整的路径名称
mstcheng@ubuntu-dev:~/117/code$ tree ./test ./test └── code.exe1directory,1filemstcheng@ubuntu-dev:~/117/code$ tree-d./test ./test0directories,0files mstcheng@ubuntu-dev:~/117/code$ tree-L1./test ./test └── code.exe1directory,1file- 不加参数时,
tree会递归列出当前目录下的所有层级;目录多时输出会很长,常用-L限制深度。 - 注意:
tree默认不显示隐藏文件,想看全量内容记得加-a。
六、cat指令
- 语法:
cat [选项] [⽂件] - 功能:查看目标文件的内容
- 常用选项:
•-b对非空输出行编号,空行不做编号
•-n对输出的所有行编号
•-s不输出多行空行 - 演示:
//使用vim 往tmp.txt里面写了一些内容 使用cat命令就能将其打印出来 mstcheng@ubuntu-dev:~/117/code$cattmp.txt hello world hello world hello world hello world mstcheng@ubuntu-dev:~/117/code$cat-btmp.txt1hello world2hello world3hello world4hello world5hello world6hello world7hello world mstcheng@ubuntu-dev:~/117/code$cat-ntmp.txt1hello world2hello world3hello world4hello world5678hello world9hello world10hello world11mstcheng@ubuntu-dev:~/117/code$cat-stmp.txt hello world hello world hello world hello world hello world hello world hello world七、echo指令
echo命令用于输出文本或变量值到终端,是 Shell 中最常用的输出指令。- 语法:
echo [选项] [字符串] - 适用对象:所有使用者
- 功能:在终端显示文本内容
- 常用选项:
•-n输出后不换行(默认会在末尾自动换行)
•-e启用转义字符解析,如\n(换行)、\t(制表符)
•-E禁用转义字符解析(默认状态)
mstcheng@ubuntu-dev:~/117/code$echohello world hello world mstcheng@ubuntu-dev:~/117/code$echo"hello world"hello world //-n 选项:输出后不换行,下一行提示符紧跟其后 mstcheng@ubuntu-dev:~/117/code$echo-n"hello world"hello worldmstcheng@ubuntu-dev:~/117/code$ //-e 选项:启用转义字符,\n 表示换行 mstcheng@ubuntu-dev:~/117/code$echo-e"hello\nworld"hello world //配合变量使用:输出变量的值 mstcheng@ubuntu-dev:~/117/code$name="MSTcheng"mstcheng@ubuntu-dev:~/117/code$echo"My name is$name"My name is MSTcheng- 不加引号时,
echo会把多个空格压缩为一个;想保留原格式建议加双引号。 - 注意:
echo默认输出后自动换行,需要连续输出时记得加-n。
六、输出重定向>:把输出写入文件
1. 现象:echo本来要写向 “显示器”,却被写进文件
- “本来是要写入到显示器文件。”、“把 echo 输出的内容,写入到了 hello.txt”
- 演示:
mstcheng@ubuntu-dev:~/117/code$cattmp.txt //把原本要向显示器打印的hello world写入到了tmp.txt文件中 mstcheng@ubuntu-dev:~/117/code$echohello world>tmp.txt mstcheng@ubuntu-dev:~/117/code$cattmp.txt hello world- 没有
>时,echo的结果到屏幕;加上>后,输出的方向被改变,写进了文件。 - 这种"把输出从默认的显示器,改到别处(文件)"的机制,就叫重定向(redirection)。
2.>的核心规则:先清空,再写入 ★
- “2、写入的时候,都是先清空再写入!!”、“清空指定的文件!!!”
- 也就是说:
echo xxx > 文件会先把目标文件的原有内容全部清空,再把新内容写进去(覆盖写)。 - 演示(验证覆盖):
mstcheng@ubuntu-dev:~/117/code$cattmp.txt hello world mstcheng@ubuntu-dev:~/117/code$echoaaaaaaaaaaaaaaaaa>tmp.txt mstcheng@ubuntu-dev:~/117/code$cattmp.txt aaaaaaaaaaaaaaaaa#覆盖掉了原来的hello world!mstcheng@ubuntu-dev:~/117/code$>tmp.txt //直接情况tmp.txt文件里的内容! mstcheng@ubuntu-dev:~/117/code$cattmp.txt mstcheng@ubuntu-dev:~/117/code$ls-a-ltotal36drwxrwxr-x8mstcheng mstcheng4096Aug2918:31.drwxrwxr-x5mstcheng mstcheng4096Aug2815:02..drwxrwxr-x2mstcheng mstcheng4096Oct282025cgdbtest drwxrwxr-x18mstcheng mstcheng4096Jul1815:22 linux-code drwxrwxr-x2mstcheng mstcheng4096Oct282025list -rw-rw-r--1mstcheng mstcheng533Oct172025makefile drwxrwxr-x2mstcheng mstcheng4096Oct212025procbar drwxrwxr-x2mstcheng mstcheng4096Aug2918:06 test1 drwxrwxr-x2mstcheng mstcheng4096Nov232025testCode -rw-rw-r--1mstcheng mstcheng0Sep118:16 tmp.txt#文件的大小清零了!!(原来tmp.txt里存的hello world被清空,只剩新内容)
- 另一个覆盖场景:直接
> hello.txt什么都不写,文件被清空成 0 字节(ls -l显示total 0、大小 0)。
3. 总结:>输出重定向
echo "内容" > 文件:新建/覆盖一个文件。cat > 文件:从键盘(终端)输入内容,Ctrl+D 结束,把输入写进文件(利用"键盘是文件")。命令 > 文件:把命令的输出保存到文件(如date > time.txt)。- 清空文件:
> 文件(三秒清空,比rm更"文明",但内容不可恢复)。
七、追加重定向>>:不清空,接着写
1. 演示
- 演示(
tmp.txt文件里已有aaaaaaaaaaaaaaaaa,再追加hello world):
//将hello world 追加到tmp.txt里 mstcheng@ubuntu-dev:~/117/code$echo"hello world">>tmp.txt mstcheng@ubuntu-dev:~/117/code$cattmp.txt aaaaaaaaaaaaaaaaa hello world>>会把内容追加到文件末尾,不会清空原内容。- 与
>(覆盖)形成对比:>每次重写,>>每次续写。
2.>>追加重定向的典型用途
- 日志累加:
echo "$(date): 出错了" >> error.log—— 每次运行都在日志末尾追加一行,适合记录多次操作。 - 生产中收集程序输出到日志文件,几乎都用
>>(不能把历史日志覆盖掉)。
八、输入重定向<:从文件读,而不是从键盘读
1. 概念
- 默认情况下,命令的数据从键盘文件读取。
- 输入重定向
命令 < 文件:让命令从指定的文件读取数据,而不是从键盘。 - 例:
cat < tmp.txt(把tmp.txt作为输入喂给 cat)—— 效果和cat tmp.txt类似。
mstcheng@ubuntu-dev:~/117/code$cat<tmp.txt aaaaaaaaaaaaaaaaa hello world2. 说明
- 输入重定向在实际中不如输出重定向常用,但它和"一切皆文件"完全一脉相承:输入源(键盘)是一个文件,可以换成另一个文件。
wc -l < 文件、sort < 文件等都可以配合使用。
在前面学
echo指令的时候,不进行重定向的情况下echo是向显示器打印!但是重定向到某一个文件之后就是向某个文件进行写入!如何理解 向显示器打印 和 写入到某个文件 之间的关系呢??
九、理论基石:Linux系统下一切皆"文件"
1. 核心
- Linux 系统下一切皆 “文件”
- 这句话的意思是:在 Linux 眼里,键盘、显示器、终端、管道、设备、网络……统统被抽象成"文件"。
- 不是只有
tmp.txt这种才是文件,几乎一切输入/输出对象都是文件。
。
2.键盘、显示器都是文件
- 键盘文件:我们输入的命令、数据,本质是从键盘文件中读取数据。
- 显示器文件:程序输出的结果,本质是向显示器文件进行写入。
- “读:从键盘文件中读取数据。”、“写:向显示器文件进行写入。”
- 也就是说:
echo打印到屏幕 =写入(底层是调用write系统调用) “显示器文件”;read/命令行输入 =读取"键盘文件"。
这里的显示器文件,键盘文件目录来说还是比较抽象,等到后面学习文件系统会给出具体的解释,还有系统调用也会在后面的章节解释!
3. 终端本身就是文件(验证)
- “验证:终端本身就是文件:/dev/pts/0。”
/dev/pts/0就是你当前打开的终端(伪终端)对应的文件。- 每个终端窗口都对应一个
/dev/pts/数字文件;可以向它写入内容(就会显示在屏幕上),也能从中读取。 - 这是"一切皆文件"最直观的验证:连你面前的终端窗口,在 Linux 里也是一个文件
- 演示:向自己的终端文件写入内容,屏幕上就会显示出来:
mstcheng@ubuntu-dev:~/117/code$tty/dev/pts/0 //向终端文件写入内容,屏幕上就会显示出来 mstcheng@ubuntu-dev:~/117/code$echo"hello, terminal file">/dev/pts/0 hello, terminalfile//把终端文件的内容重定向给 cat,cat 再从终端文件里读出来 mstcheng@ubuntu-dev:~/117/code$cat</dev/pts/0 hello, terminalfiletty命令会打印当前终端对应的设备文件路径(如/dev/pts/0)。- 用
echo xxx > /dev/pts/0向这个"终端文件"写入,内容会实时显示在屏幕上——证明终端确实是一个文件。 - 同理,
cat < /dev/pts/0表示从终端文件读取数据,和从键盘读取本质相
十、总结
- 文件操作:
mkdir -p递归建目录;rm删文件/目录(目录加-r);cp复制(目录加-r);mv移动或重命名。 - 查看输出:
tree树状展示目录;cat查看文件;echo输出文本或变量。 - 帮助:
man按章节查手册(man 2系统调用、man 3库函数)。 - 重定向:
>覆盖写入;>>追加写入;<从文件读入。 - 核心思想:Linux 一切皆文件——键盘、显示器、终端都是文件,
/dev/pts/0即当前终端文件,向它写入会实时显示在屏幕。
以上就是本篇文章的所有内容了!掌握了这些指令与重定向,就抓住了 Linux 文件操作与输入输出的核心脉络。下一期我们来将文件相关的指令,如果觉得文章对你有益的话不妨来个三连支持一下!感谢!