欢迎光临
我们一直在努力

Linux 基础指令入门:从目录结构到 ls、cd、touch、mkdir 和 rm

Linux 基础指令入门:从目录结构到 ls、cd、touch、mkdir 和 rm

头像

🔥 星恒随风:
个人主页

❄️ 个人专栏:
《指针合集》

《C语言基础》

《数据结构》

《机器学习导论》

《前端基础》

《python基础》

《C++从入门到入土》

✨ 数据即知识,压缩即智能


文章目录

  • Linux 基础指令入门:从目录结构到 ls、cd、touch、mkdir 和 rm
    • 前言
    • 一、Linux 是怎么来的?
      • 1.1 从 UNIX 说起
      • 1.2 Linux 的诞生
      • 1.3 Linux 内核不等于完整操作系统
    • 二、开源和 Linux 发行版
      • 2.1 什么是开源?
      • 2.2 为什么会有不同发行版?
      • 2.3 Linux 应用在哪些地方?
    • 三、操作系统和 Shell 分别负责什么?
      • 3.1 操作系统位于用户和硬件之间
      • 3.2 Shell 是什么?
      • 3.3 终端和 Shell 不是同一个东西
    • 四、为什么服务器经常使用命令行?
      • 4.1 节省资源
      • 4.2 便于远程管理
      • 4.3 便于自动化
      • 4.4 操作过程容易复现
    • 五、通过 SSH 远程登录 Linux
      • 5.1 什么是 SSH?
      • 5.2 查看 Linux 主机地址
      • 5.3 使用 ssh 登录
    • 六、看懂 Linux 命令提示符
    • 七、Linux 中一切从目录树开始
      • 7.1 Linux 没有盘符结构
      • 7.2 一个简化的 Linux 目录结构
      • 7.3 文件和目录都是目录树中的结点
    • 八、路径:如何准确找到文件?
      • 8.1 什么是路径?
      • 8.2 绝对路径
      • 8.3 相对路径
      • 8.4 几个特殊路径符号
        • 当前目录:`.`
        • 上级目录:`..`
        • 家目录:`~`
        • 最近一次所在目录:`-`
    • 九、ls:查看目录中有什么
      • 9.1 基本语法
      • 9.2 为什么 ls 默认看不到隐藏文件?
      • 9.3 `ls -l`:查看详细信息
      • 9.4 常用选项
      • 9.5 `ls -F` 的类型标记
      • 9.6 `ls -d` 查看目录本身
      • 9.7 `ll` 是什么?
    • 十、pwd:确认当前所在目录
      • 10.1 基本语法
      • 10.2 为什么经常先执行 pwd?
    • 十一、cd:切换工作目录
      • 11.1 基本语法
      • 11.2 进入指定目录
      • 11.3 使用相对路径进入目录
      • 11.4 返回上级目录
      • 11.5 返回家目录
      • 11.6 回到根目录
      • 11.7 在两个目录之间切换
      • 11.8 带空格的目录名
    • 十二、touch:创建空文件或更新时间
      • 12.1 基本语法
      • 12.2 touch 不只是创建文件
      • 12.3 使用 stat 查看文件信息
      • 12.4 只更新访问时间
      • 12.5 只更新修改时间
      • 12.6 文件不存在时不要创建
      • 12.7 一次创建多个文件
    • 十三、mkdir:创建目录
      • 13.1 基本语法
      • 13.2 一次创建多个目录
      • 13.3 创建多级目录时的问题
      • 13.4 使用 `mkdir -p` 创建完整路径
      • 13.5 重复执行 mkdir -p
    • 十四、rmdir:删除空目录
      • 14.1 基本语法
      • 14.2 非空目录不能使用 rmdir 删除
      • 14.3 使用 `rmdir -p` 删除空路径
      • 14.4 父目录中有其他文件时会停止
    • 十五、rm:删除文件或目录
      • 15.1 基本语法
      • 15.2 删除普通文件
      • 15.3 一次删除多个文件
      • 15.4 rm 默认不能删除目录
      • 15.5 使用 `rm -r` 递归删除目录
      • 15.6 使用 `rm -i` 逐项确认
      • 15.7 使用 `rm -f` 强制处理
      • 15.8 `rm -rf` 为什么危险?
      • 15.9 执行 rm 前的安全检查
        • 第一步:确认当前目录
        • 第二步:查看目标内容
        • 第三步:先使用交互模式
        • 第四步:确认变量不为空
        • 第五步:使用 `–` 分隔选项和文件名
      • 15.10 rmdir 和 rm 如何选择?
    • 十六、把这些命令串起来
      • 16.1 创建练习环境
      • 16.2 进入项目目录
      • 16.3 创建文件
      • 16.4 查看目录
      • 16.5 删除一个文件
      • 16.6 删除整个练习目录
    • 十七、常见错误整理
      • 17.1 混淆 `/` 和 `/root`
      • 17.2 认为 `~` 永远表示 `/root`
      • 17.3 把相对路径当成绝对路径
      • 17.4 使用 ls 看不到隐藏文件
      • 17.5 把 `ll` 当成所有系统都有的命令
      • 17.6 认为 touch 会清空文件
      • 17.7 混淆 touch 的 `-m` 和 `-c`
      • 17.8 mkdir 创建多级目录失败
      • 17.9 使用 rmdir 删除非空目录
      • 17.10 在错误目录执行 rm

前言

第一次接触 Linux 时,很多人会觉得它不如 Windows 直观。

Windows 中创建文件夹、查看文件和删除目录,通常只需要使用鼠标完成;到了 Linux 服务器上,屏幕里却只剩下一个终端窗口:

[root@xxx ~]#

看起来似乎什么都没有,实际却并不复杂。

Linux 命令行中的大部分操作,都可以归纳为三个问题:

我现在在哪里?
这里有什么?
我要对哪个文件或目录做什么?

对应到命令就是:

pwd:我现在在哪里
ls :这里有什么
cd :切换到其他目录
touch:创建文件或更新时间
mkdir:创建目录
rmdir:删除空目录
rm:删除文件或目录

本文从 Linux 的基本背景出发,逐步讲清目录树、绝对路径、相对路径和常用文件操作命令。


一、Linux 是怎么来的?

1.1 从 UNIX 说起

Linux 并不是凭空出现的,它在设计思想上深受 UNIX 影响。

UNIX 最初诞生于 20 世纪 60 年代末。贝尔实验室的 Ken Thompson、Dennis Ritchie 等人参与了早期 UNIX 的开发。

UNIX 在当时形成了许多影响深远的设计思想,例如:

多用户
多任务
层次化文件系统
小工具组合
文本作为通用接口

后来,UNIX 逐渐发展出不同分支,其中比较有代表性的两条路线是:

AT&T System V
BSD UNIX

不同 UNIX 系统虽然实现不完全相同,但许多命令、目录结构和编程接口具有共同的设计基础。

1.2 Linux 的诞生

1991 年,Linus Torvalds 开始开发一个类 UNIX 操作系统内核,这就是后来的 Linux 内核。

早期 Linux 可以运行 Bash、GCC 等 GNU 工具。随着越来越多开发者参与,Linux 内核不断完善,并在 1994 年发布了 1.0 版本。

Linux 的发展并不是某一家公司单独完成的,而是由大量个人、社区和企业共同推动的。

1.3 Linux 内核不等于完整操作系统

严格来说,Linux 指的是操作系统内核。

内核主要负责管理:

进程
内存
文件系统
硬件设备
网络
系统调用

但一台计算机只有内核还无法直接满足日常使用需求,还需要:

Shell
编译器
系统命令
软件包管理器
桌面环境
应用程序
系统服务

把 Linux 内核和这些用户空间工具组合起来,才形成一个可以安装和使用的 Linux 发行版。

可以简单理解为:

Linux 内核
+
GNU 工具和系统命令
+
软件包管理器
+
系统服务与应用程序

Linux 发行版


二、开源和 Linux 发行版

2.1 什么是开源?

开源软件不仅向用户提供可执行程序,还按照许可证的规定提供源代码。

用户通常可以在许可证允许的范围内:

阅读源代码
学习实现原理
修改源代码
重新编译
分发修改后的版本

Linux 内核整体采用 GPLv2 许可证。开源并不简单等于“免费”,更重要的是源代码的使用、修改和分发受到公开许可证约束。

2.2 为什么会有不同发行版?

不同用户对操作系统的需求并不相同。

例如:

桌面用户关心易用性
开发者关心工具链
服务器管理员关心稳定性
企业关心支持周期
嵌入式设备关心体积和可定制性

因此,围绕 Linux 内核逐渐形成了许多发行版。

常见发行版包括:

发行版主要特点
Debian 社区维护,强调自由软件与稳定性
Ubuntu 基于 Debian,桌面、服务器和云环境中都很常见
Fedora 更新较快,经常较早引入新技术
RHEL Red Hat 提供的企业级商业发行版
CentOS Stream 位于 Fedora 与 RHEL 之间的持续交付发行版
Rocky Linux 面向企业服务器场景的社区发行版
AlmaLinux 面向企业服务器场景的社区发行版
Kali Linux 面向安全测试和取证工具使用场景

旧资料中常把 CentOS 描述为 RHEL 的免费重构版本。这个描述主要适用于早期的 CentOS Linux。现在学习和部署时,应注意区分:

CentOS Linux
CentOS Stream
Rocky Linux
AlmaLinux

2.3 Linux 应用在哪些地方?

Linux 的应用范围很广,常见场景包括:

服务器
云计算平台
容器环境
超级计算机
网络设备
嵌入式设备
智能电视
路由器
Android 设备
开发环境

我们在学习 C、C++、操作系统、计算机网络和后端开发时,通常会频繁接触 Linux。


三、操作系统和 Shell 分别负责什么?

3.1 操作系统位于用户和硬件之间

从整体结构上看,计算机可以分成几层:

用户

应用程序与命令

操作系统

设备驱动

硬件

操作系统的核心作用,可以概括为两点:

管理计算机资源
为应用程序提供统一接口

例如,程序想读取文件时,不需要自己研究硬盘扇区,而是通过操作系统提供的接口完成。

操作系统负责把底层硬件细节封装起来,让上层程序更容易使用计算机。

3.2 Shell 是什么?

Shell 是用户与操作系统交互的一层命令解释器。

当我们输入:

[root@xxx ~]# ls

大致会经历下面的过程:

用户输入 ls

Shell 解析命令

找到对应程序

创建进程并运行

程序访问操作系统接口

结果显示在终端中

Linux 中常见的 Shell 包括:

Bash
Zsh
Fish
Dash

初学阶段接触最多的是 Bash。

3.3 终端和 Shell 不是同一个东西

终端负责显示字符和接收键盘输入。

Shell 负责解释我们输入的命令。

可以把二者简单类比为:

终端:窗口和输入设备
Shell:运行在窗口中的命令解释器

当我们通过 SSH 连接服务器时,看到的是远程 Shell 在本地终端中的交互结果。


四、为什么服务器经常使用命令行?

Linux 也可以安装桌面环境,但服务器上更常见的是纯命令行环境。

主要原因包括:

4.1 节省资源

图形界面需要占用额外的:

内存
CPU
磁盘空间
图形相关服务

服务器更希望把资源留给业务程序。

4.2 便于远程管理

通过 SSH,只需要传输字符数据,就可以在网络另一端管理服务器。

即使网络速度一般,命令行仍然可以保持较好的响应速度。

4.3 便于自动化

图形界面操作通常需要人工点击,而命令可以放入脚本中反复执行。

例如:

mkdir -p project/src
touch project/src/main.cpp

相同命令可以在多台机器上执行,也可以交给自动部署工具执行。

4.4 操作过程容易复现

别人告诉你“点击某个按钮”,可能受到系统版本和界面布局影响。

命令行则可以直接记录:

mkdir -p /root/linux_demo
cd /root/linux_demo
touch test.txt

只要环境一致,操作过程通常就可以复现。


五、通过 SSH 远程登录 Linux

5.1 什么是 SSH?

SSH 是一种安全的远程登录协议。

我们可以在自己的电脑上打开 SSH 客户端,然后连接远程 Linux 主机。

常见客户端包括:

Windows Terminal
PowerShell
XShell
PuTTY
Linux 终端
macOS 终端

具体使用哪一个客户端并不重要,底层连接方式基本一致。

5.2 查看 Linux 主机地址

较新的 Linux 系统中,建议使用:

[root@xxx ~]# ip addr

也可以使用简化形式:

[root@xxx ~]# ip a

只想快速查看本机地址时,也可以尝试:

[root@xxx ~]# hostname -I

一些旧资料使用:

[root@xxx ~]# ifconfig

但不少现代发行版默认不再安装 ifconfig,更推荐使用 ip 命令。

5.3 使用 ssh 登录

基本语法:

ssh 用户名@服务器地址

例如:

ssh root@<服务器IP>

首次连接时,终端可能询问是否信任远程主机指纹。确认地址无误后输入:

yes

随后输入密码或使用 SSH 密钥完成认证。

登录成功后,可能看到:

[root@xxx ~]#

实际服务器通常不建议直接开放 root 密码登录。更常见的方式是先使用普通用户登录,再通过 sudo 执行管理操作。


六、看懂 Linux 命令提示符

一个常见提示符如下:

[root@xxx ~]#

可以拆成:

root:当前用户
xxx :当前主机名
~ :当前目录
# :超级用户提示符

普通用户通常使用 $:

[user@xxx ~]$

超级用户通常使用 #:

[root@xxx ~]#

这里的 # 不是需要输入的命令内容,它只是 Shell 显示的提示符。

例如,看到:

[root@xxx ~]# pwd

真正输入的只有:

pwd


七、Linux 中一切从目录树开始

7.1 Linux 没有盘符结构

Windows 中常见:

C:\\
D:\\
E:\\

Linux 不使用这种盘符方式。所有文件和目录统一组织在一棵目录树中。

目录树的起点是:

/

它叫做根目录。

注意区分:

/ 根目录
/root root 用户的家目录

二者不是同一个目录。

7.2 一个简化的 Linux 目录结构

/
├── bin
├── boot
├── dev
├── etc
├── home
├── lib
├── root
├── tmp
├── usr
└── var

常见目录可以先简单理解为:

目录常见用途
/ 整棵目录树的根
/home 普通用户的家目录
/root root 用户的家目录
/etc 系统和服务的配置文件
/usr 大量程序、库和共享数据
/var 日志、缓存等经常变化的数据
/tmp 临时文件
/dev 设备文件
/boot 启动相关文件

初学阶段不需要一次背完所有目录,只需要先理解:

Linux 中所有文件都能从根目录 / 出发,通过一条路径定位。

7.3 文件和目录都是目录树中的结点

在目录树中:

目录可以继续包含其他文件和目录
普通文件通常位于目录树的叶子位置
空目录也可以是叶子结点

例如:

/
└── root
└── linux_demo
├── notes.txt
└── project
└── main.cpp

notes.txt 的位置可以表示为:

/root/linux_demo/notes.txt


八、路径:如何准确找到文件?

8.1 什么是路径?

路径就是从某个起点出发,按照目录层次定位文件或目录的描述。

例如:

/root/linux_demo/project/main.cpp

表示:

从根目录 /
进入 root
进入 linux_demo
进入 project
找到 main.cpp

8.2 绝对路径

从根目录 / 开始的路径叫做绝对路径:

/root/linux_demo
/etc/ssh/sshd_config
/usr/bin/g++

特点是:

以 / 开头
不依赖当前所在目录
位置表达明确

无论当前处于哪个目录:

cd /root/linux_demo

定位到的都是同一个地方。

8.3 相对路径

相对于当前目录书写的路径叫做相对路径。

假设当前位于:

/root/linux_demo

进入 project 目录可以写:

cd project

进入其中的 src 目录可以写:

cd project/src

相对路径不以 / 开头,它的含义依赖当前工作目录。

8.4 几个特殊路径符号

当前目录:.

.

表示当前目录。

例如:

ls .

表示查看当前目录内容。

上级目录:..

..

表示当前目录的父目录。

例如:

cd ..

表示进入上一级目录。

家目录:~

~

表示当前用户的家目录。

对于 root 用户:

~ 等价于 /root

最近一次所在目录:-

cd

可以在当前目录和上一次所在目录之间切换。


九、ls:查看目录中有什么

9.1 基本语法

ls [选项] [文件或目录]

不提供参数时,ls 查看当前目录:

[root@xxx ~]# ls
linux_demo

查看指定目录:

[root@xxx ~]# ls /root/linux_demo
file.txt project

9.2 为什么 ls 默认看不到隐藏文件?

Linux 中,以 . 开头的名字通常被视为隐藏文件或隐藏目录。

例如:

.bashrc
.ssh
.config

普通 ls 默认不会显示它们。

使用:

[root@xxx ~]# ls -a
. .. .bashrc .ssh linux_demo

其中:

. 表示当前目录
.. 表示上级目录

9.3 ls -l:查看详细信息

[root@xxx ~]# ls -l
total 4
drwxr-xr-x 3 root root 4096 Jul 31 20:10 linux_demo

这一行可以先粗略拆分为:

drwxr-xr-x:文件类型和权限
3 :链接数量
root :所有者
root :所属组
4096 :大小
Jul 31… :修改时间
linux_demo :名称

权限部分会在后续文章中单独展开。

9.4 常用选项

选项作用
-a 显示所有文件,包括隐藏文件
-l 使用长格式显示详细信息
-h 配合 -l 显示更容易阅读的文件大小
-d 显示目录本身,而不是目录中的内容
-F 在名称后添加类型标记
-i 显示 inode 编号
-n 使用数字 UID、GID 显示所有者
-r 反向排序
-t 按修改时间排序
-R 递归查看子目录
-1 每行只显示一个名称

选项可以组合:

[root@xxx ~]# ls -alF

也可以写成:

[root@xxx ~]# ls -a -l -F

两者效果相同。

9.5 ls -F 的类型标记

[root@xxx linux_demo]# ls -F
app* project/ shortcut@ notes.txt

常见标记包括:

/ 目录
* 可执行文件
@ 符号链接
| 命名管道
= 套接字

普通文件通常不会添加符号。

9.6 ls -d 查看目录本身

直接执行:

ls /root/linux_demo

看到的是目录中的内容。

使用:

[root@xxx ~]# ls -ld /root/linux_demo
drwxr-xr-x 3 root root 4096 Jul 31 20:10 /root/linux_demo

看到的是 linux_demo 目录本身的信息。

9.7 ll 是什么?

一些 Linux 发行版中可以使用:

ll

它通常是:

ls -l

或:

ls -alF

的别名。

不过 ll 并不是所有系统都默认存在。为了保证命令具有更好的通用性,文章中主要使用:

ls -l


十、pwd:确认当前所在目录

10.1 基本语法

pwd

pwd 是:

print working directory

的缩写,用于显示当前工作目录。

例如:

[root@xxx ~]# pwd
/root

进入其他目录后:

[root@xxx ~]# cd /root/linux_demo
[root@xxx linux_demo]# pwd
/root/linux_demo

10.2 为什么经常先执行 pwd?

在图形界面中,我们可以通过窗口地址栏判断当前位置。

在命令行中,如果不确定自己位于哪里,最直接的方法就是:

pwd

特别是在执行删除或批量操作之前,建议先确认:

[root@xxx linux_demo]# pwd
/root/linux_demo

防止因为目录判断错误而操作了错误的文件。


十一、cd:切换工作目录

11.1 基本语法

cd 目录路径

cd 是:

change directory

的缩写。

11.2 进入指定目录

[root@xxx ~]# cd /root/linux_demo
[root@xxx linux_demo]# pwd
/root/linux_demo

这里使用的是绝对路径。

11.3 使用相对路径进入目录

假设当前结构为:

/root/linux_demo
├── project
└── temp

当前位于:

/root/linux_demo/project

切换到同级的 temp:

[root@xxx project]# cd ../temp
[root@xxx temp]# pwd
/root/linux_demo/temp

分析这条路径:

.. 回到 linux_demo
temp 进入 temp

11.4 返回上级目录

[root@xxx temp]# cd ..
[root@xxx linux_demo]# pwd
/root/linux_demo

连续返回两级:

cd ../..

11.5 返回家目录

下面几种写法都可以回到家目录:

cd

cd ~

对于 root 用户:

[root@xxx linux_demo]# cd ~
[root@xxx ~]# pwd
/root

11.6 回到根目录

[root@xxx ~]# cd /
[root@xxx /]# pwd
/

11.7 在两个目录之间切换

[root@xxx ~]# cd /root/linux_demo
[root@xxx linux_demo]# cd /
[root@xxx /]# cd –
/root/linux_demo
[root@xxx linux_demo]# cd –
/

cd – 很适合在两个常用目录之间往返。

11.8 带空格的目录名

如果目录名中包含空格,需要使用引号:

cd "my project"

或者使用反斜杠转义:

cd my\\ project

在 Linux 项目目录中,一般更推荐使用:

my_project
my-project

避免使用空格,能够减少命令书写中的麻烦。


十二、touch:创建空文件或更新时间

12.1 基本语法

touch [选项] 文件...

touch 最常见的用途是创建空文件:

[root@xxx ~]# mkdir -p /root/linux_demo
[root@xxx ~]# cd /root/linux_demo
[root@xxx linux_demo]# touch newFile.txt
[root@xxx linux_demo]# ls
newFile.txt

此时创建了一个大小为 0 的普通文件。

12.2 touch 不只是创建文件

touch 的本质是更新文件时间戳。

如果文件不存在:

touch newFile.txt

默认会创建文件。

如果文件已经存在:

touch newFile.txt

通常不会清空原有内容,而是更新它的访问时间和修改时间。

12.3 使用 stat 查看文件信息

[root@xxx linux_demo]# stat newFile.txt
File: newFile.txt
Size: 0
Access: 2026-07-31 20:20:00
Modify: 2026-07-31 20:20:00
Change: 2026-07-31 20:20:00

常见时间包括:

Access:最后访问时间,简称 atime
Modify:文件内容最后修改时间,简称 mtime
Change:inode 状态最后变化时间,简称 ctime

ctime 不是文件的创建时间,而是文件元数据发生变化的时间。

12.4 只更新访问时间

[root@xxx linux_demo]# touch -a newFile.txt

-a 主要更新文件的访问时间。

12.5 只更新修改时间

[root@xxx linux_demo]# touch -m newFile.txt

-m 主要更新文件内容修改时间。

需要注意:

-a:access time
-m:modification time

不要把 -c 误认为修改时间选项。

12.6 文件不存在时不要创建

[root@xxx linux_demo]# touch -c not_exist.txt
[root@xxx linux_demo]# ls
newFile.txt

-c 或 –no-create 表示:

如果目标文件不存在,不要创建新文件。

12.7 一次创建多个文件

[root@xxx linux_demo]# touch main.cpp test.cpp README.md
[root@xxx linux_demo]# ls
README.md main.cpp newFile.txt test.cpp

Shell 会把多个文件名依次作为参数传递给 touch。


十三、mkdir:创建目录

13.1 基本语法

mkdir [选项] 目录...

创建一个目录:

[root@xxx linux_demo]# mkdir project
[root@xxx linux_demo]# ls -F
project/

13.2 一次创建多个目录

[root@xxx linux_demo]# mkdir src include build
[root@xxx linux_demo]# ls -F
build/ include/ project/ src/

13.3 创建多级目录时的问题

假设 lesson01 还不存在,直接执行:

[root@xxx linux_demo]# mkdir lesson01/code/src
mkdir: cannot create directory 'lesson01/code/src': No such file or directory

mkdir 默认只能在父目录已经存在时创建下一层目录。

13.4 使用 mkdir -p 创建完整路径

[root@xxx linux_demo]# mkdir -p lesson01/code/src

-p 或 –parents 会自动创建路径中缺失的父目录。

创建后结构为:

lesson01
└── code
└── src

可以使用:

[root@xxx linux_demo]# tree lesson01
lesson01
└── code
└── src

如果系统没有安装 tree,也可以使用:

find lesson01

或者:

ls -R lesson01

13.5 重复执行 mkdir -p

mkdir -p lesson01/code/src

即使目录已经存在,通常也不会报错。

因此,mkdir -p 经常出现在:

Shell 脚本
项目初始化脚本
自动部署脚本
构建脚本

中。


十四、rmdir:删除空目录

14.1 基本语法

rmdir [选项] 目录...

rmdir 专门用于删除空目录。

例如:

[root@xxx linux_demo]# mkdir empty_dir
[root@xxx linux_demo]# rmdir empty_dir
[root@xxx linux_demo]# ls

14.2 非空目录不能使用 rmdir 删除

[root@xxx linux_demo]# mkdir data
[root@xxx linux_demo]# touch data/file.txt
[root@xxx linux_demo]# rmdir data
rmdir: failed to remove 'data': Directory not empty

因为 data 中存在文件,所以删除失败。

这也是 rmdir 相对安全的地方:

它不会直接递归删除目录中的内容。

14.3 使用 rmdir -p 删除空路径

创建多级空目录:

[root@xxx linux_demo]# mkdir -p path1/path2/path3

删除最深层目录,并向上删除已经变空的父目录:

[root@xxx linux_demo]# rmdir -p path1/path2/path3

如果整个路径都为空,那么:

path3 被删除
path2 变空后被删除
path1 变空后被删除

14.4 父目录中有其他文件时会停止

[root@xxx linux_demo]# mkdir -p path1/path2/path3
[root@xxx linux_demo]# touch path1/keep.txt
[root@xxx linux_demo]# rmdir -p path1/path2/path3
rmdir: failed to remove directory 'path1': Directory not empty

此时:

path3 被删除
path2 被删除
path1 中还有 keep.txt,因此保留


十五、rm:删除文件或目录

15.1 基本语法

rm [选项] 文件或目录...

rm 是:

remove

的缩写。

它可以删除文件,配合选项后也可以删除目录。

15.2 删除普通文件

[root@xxx linux_demo]# touch file.txt
[root@xxx linux_demo]# ls
file.txt
[root@xxx linux_demo]# rm file.txt
[root@xxx linux_demo]# ls

删除后,file.txt 不再存在。

Linux 命令行中的 rm 通常不会把文件移动到桌面环境的回收站。删除完成后,普通用户很难直接恢复。

因此,执行删除操作前要认真检查路径。

15.3 一次删除多个文件

[root@xxx linux_demo]# touch a.txt b.txt c.txt
[root@xxx linux_demo]# rm a.txt b.txt c.txt

也可以使用通配符:

rm *.txt

这表示删除当前目录下所有以 .txt 结尾的匹配项。

使用通配符前,建议先查看匹配结果:

ls *.txt

确认无误后再执行:

rm *.txt

15.4 rm 默认不能删除目录

[root@xxx linux_demo]# mkdir project
[root@xxx linux_demo]# rm project
rm: cannot remove 'project': Is a directory

默认情况下,rm 只删除文件。

15.5 使用 rm -r 递归删除目录

[root@xxx linux_demo]# mkdir -p project/src
[root@xxx linux_demo]# touch project/src/main.cpp
[root@xxx linux_demo]# rm -r project

-r 表示递归删除:

先处理目录中的文件和子目录
再删除目录本身

它可以删除非空目录,所以风险明显高于 rmdir。

15.6 使用 rm -i 逐项确认

[root@xxx linux_demo]# touch important.txt
[root@xxx linux_demo]# rm -i important.txt
rm: remove regular empty file 'important.txt'? y

输入:

y

确认删除。

输入:

n

取消删除。

删除目录时也可以组合:

rm -ri project

系统会逐层询问是否进入和删除目录。

15.7 使用 rm -f 强制处理

rm -f file.txt

-f 表示:

忽略不存在的文件
尽量不进行交互询问

例如:

[root@xxx linux_demo]# rm -f not_exist.txt

文件不存在时通常也不会报错。

15.8 rm -rf 为什么危险?

rm -rf 目录

组合了:

-r:递归进入所有子目录
-f:不进行常规询问

例如:

[root@xxx linux_demo]# rm -rf project

可以直接删除整个 project 目录及其全部内容。

这条命令本身并不是错误命令,项目清理和自动化脚本中经常会用到。危险之处在于:

一旦路径写错,删除范围可能远大于预期。

尤其是在 root 用户下执行时,能够删除大量系统文件。

15.9 执行 rm 前的安全检查

第一步:确认当前目录

pwd

第二步:查看目标内容

ls -al target

第三步:先使用交互模式

rm -ri target

第四步:确认变量不为空

Shell 脚本中不要直接写:

rm -rf "$TARGET_DIR"

至少应先检查:

if [ -n "$TARGET_DIR" ] && [ "$TARGET_DIR" != "/" ]; then
rm -rf"$TARGET_DIR"
fi

第五步:使用 — 分隔选项和文件名

假设有一个文件名为:

-f

直接执行:

rm -f

会被解释成选项。

可以写成:

rm-f

— 表示后面的内容全部按照普通参数处理,不再解析成命令选项。

15.10 rmdir 和 rm 如何选择?

场景推荐命令
删除普通文件 rm file
删除空目录 rmdir dir
删除非空目录 rm -r dir
删除前需要确认 rm -i file
递归删除并逐项确认 rm -ri dir
自动化中忽略不存在文件 rm -f file
强制递归删除目录 rm -rf dir,必须谨慎

初学阶段可以形成一个习惯:

能够使用 rmdir 时,优先使用 rmdir
需要递归删除时,先使用 rm -ri
确认目标完全正确后,再考虑 rm -rf


十六、把这些命令串起来

前面看起来讲了很多命令,实际可以串成一条完整的文件操作流程。

16.1 创建练习环境

[root@xxx ~]# mkdir -p /root/linux_demo/project/src

目录结构变成:

/root/linux_demo
└── project
└── src

16.2 进入项目目录

[root@xxx ~]# cd /root/linux_demo/project
[root@xxx project]# pwd
/root/linux_demo/project

16.3 创建文件

[root@xxx project]# touch README.md
[root@xxx project]# touch src/main.cpp src/test.cpp

16.4 查看目录

[root@xxx project]# ls -alF

递归查看:

[root@xxx project]# ls -R
.:
README.md src

./src:
main.cpp test.cpp

16.5 删除一个文件

[root@xxx project]# rm -i src/test.cpp
rm: remove regular empty file 'src/test.cpp'? y

16.6 删除整个练习目录

先返回上级目录:

[root@xxx project]# cd ..
[root@xxx linux_demo]# pwd
/root/linux_demo

确认目标:

[root@xxx linux_demo]# ls -al project

再删除:

[root@xxx linux_demo]# rm -ri project

完整过程可以概括为:

mkdir 创建目录

cd 进入目录

pwd 确认位置

touch 创建文件

ls 查看结果

rm 或 rmdir 删除


十七、常见错误整理

17.1 混淆 / 和 /root

/ 是根目录
/root 是 root 用户的家目录

执行:

cd /

进入的是整棵文件系统的根。

执行:

cd /root

进入的是 root 用户家目录。

17.2 认为 ~ 永远表示 /root

~ 表示当前用户的家目录。

对于 root:

~ -> /root

对于普通用户 student:

~ -> /home/student

17.3 把相对路径当成绝对路径

cd root/linux_demo

这是相对路径,表示从当前目录寻找 root/linux_demo。

绝对路径应写成:

cd /root/linux_demo

前面的 / 不能省略。

17.4 使用 ls 看不到隐藏文件

普通:

ls

不会显示以 . 开头的文件。

需要使用:

ls -a

17.5 把 ll 当成所有系统都有的命令

ll 通常只是 Shell 别名,不是所有环境都存在。

更通用的写法是:

ls -l

17.6 认为 touch 会清空文件

对已经存在的文件执行:

touch file.txt

通常只是更新时间,不会删除原有内容。

17.7 混淆 touch 的 -m 和 -c

正确含义:

touch -m:更新修改时间
touch -c:文件不存在时不要创建

17.8 mkdir 创建多级目录失败

错误:

mkdir a/b/c

如果 a、b 不存在,就会失败。

正确:

mkdir -p a/b/c

17.9 使用 rmdir 删除非空目录

rmdir data

只能删除空目录。

非空目录需要:

rm -r data

但执行前必须确认目录内容。

17.10 在错误目录执行 rm

执行删除前,建议养成下面的顺序:

pwd
ls -al
rm -i 目标

不要在不清楚当前位置时直接执行递归删除。


赞(0)
未经允许不得转载:171主机测评 » Linux 基础指令入门:从目录结构到 ls、cd、touch、mkdir 和 rm
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址