内容纲要

🗂 | 查看 Linux 专题可浏览更多内容


接上一篇,在了解如何使用虚拟控制台或终端仿真器以访问 Shell、Shell 提示符的含义以及命令的基本构成及使用后,可以了解更多命令了。

在文件系统中到处逛逛

pwd——我在哪?

在上一篇提到,一般来说在首次登陆系统或启动终端仿真器时工作目录位于 ~,那么如何知道这个 ~ 的具体路径?答案是使用 pwd命令。

pwd 命令的全称为「print working directory」,用于显示当前目录的绝对路径。

tom@debian:~$ pwd
/home/tom

在创建用户时一般会创建一个以用户名为名的用户主目录。如上,用户 tom 的主目录为 /home/tom

💡 一般来说主目录是普通用户唯一有写入权限的地方。

你可以在任何工作目录使用 pwd 命令了解你当前所在目录的绝对路径。

ls——都有啥?

ls 命令列出目标目录下的文件。

你可以使用 ls 命令来列出当前工作目录下都有什么东西:

$ ls /home
tom

cd——换地方

cd 命令的全称为「change directory」,也就是改变当前的工作目录。

刚才只是查看了 /home 目录下都有什么,现在要切换工作目录到 /home 目录:

$ cd /home

cd 命令的一些实用技巧:

# 回到来时的目录:
$ cd -
# 去到当前用户的主目录:
$ cd ~
# 去到目标用户的主目录,如 jerry 用户:
$ cd ~jerry

命令补全

可以使用 Tab 键进行命令补全,以提高效率。

如上示例,可以在输入到 cd /h 时按下 Tab 键就可以看到 Shell 为我们补全了命令 cd /home/

有时候会发现按了 Tab 键没有反应,那可能是出现了需要选择的情况,如根目录下有三个 s 字母开头的目录,而当使用的命令

 $ cd /s

此时按第一下 Tab 键是没有反应的,再一次 Tab 键就可以看到提示:

sbin/ srv/  sys/

这是告诉我们有 3 个 s 开头的目录,要选择哪个呢?比如想要去的 sbin 目录,那么多输入一位字母如 cd /sb 再按 Tab 键就可以成功补全了。

绝对路径与相对路径

在前面使用 pwd 命令了解到绝对路径就是从根目录开始直到目标目录或文件的完整路径。

而相对路径则是从工作目录开始的路径,主要运用表示当前目录的 . 及表示当前目录的父级目录的 ..,假设当前工作目录为 /home,那么

# 当想去到 /home 目录下的 tom 目录时:
$ cd ./tom
# 当然一般简写成:
$ cd tom

# 当想去到 /home 目录的父级,也就是根目录时:
$ cd .. # 虽说直接写 cd / 也很方便,但日后在一些复杂的路径下时使用 .. 就能体会到 .. 的方便之处了

文件树系统

类 Unix 系统与 Windows 系统一样按照有层次的目录结构来组织文件的。也就是说文件是类似于树状的目录结构组织的,其中包含了文件和子目录,而子目录中还可以包含更多的文件和子目录,依此类推。

💡 在一些系统中「目录」也被称为「文件夹」。

文件系统中的第一个目录 / 被称为「根目录」。

根目录下有哪些东西?

$ tree -Ld 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

根据 Filesystem Hierarchy Standard 标准,这些重要的标准目录及内容含义如下:

路径名 内容
/bin 核心操作系统命令
/boot 引导装载程序、内核以及内核所需要的文件
/compat FreeBSD 中用于实现 Linux 二进制兼容的文件及库
/dev 磁盘、打印机、伪终端等设备项
/etc 关键的启动文件和配置文件
/home 用户默认的主目录
/lib 库、共享库及 /bin、/sbin 要用到的一些命令
/media 用于可移除设备文件系统的挂载点
/mnt 可移动设备的临时挂载点
/opt 可选的软件包
/proc 有关所有正在运行的进程的信息
/root 超级用户的主目录
/run 运行程序的汇集处(PID、Socket 等)
/sbin 核心操作系统命令
/srv Web 或其他服务器需要用到的文件
/sys 另一种不同的内核接口
/tmp 临时文件,系统重启后可能会消失
/usr 另一个层次结构,包含了次要的文件及命令
/usr/bin 大部分命令及可执行文件
/usr/include 编译 C 程序时需要用到的头文件
/usr/lib 库以及标准程序的支持文件
/usr/local 本地软件或配置数据,是 /usr 的镜像结构
/usr/sbin 不太必须的系统管理与修复命令
/usr/share 可在多个系统之间共享的内容
/usr/share/man 在线手册页
/usr/src 非本地软件的源代码(未广泛使用)
/usr/tmp 更多的临时空间(在重新启动之后会保留)
/var 系统特定的数据以及少数配置文件
/var/adm 包含各种内容:日志、设置记录、奇怪的管理信息
/var/log 系统日志文件
/var/run 和 /run 功能一样,现通常作为一个符号链接
/var/spool 供打印机、邮件等使用的假脱机(存储)目录
/var/tmp 更多的临时空间(在重新启动之后会保留)

💡 Windows 上的存储设备,如硬盘、外接移动硬盘或 U 盘就是以新的盘符的形式出现,有着各自独立的文件系统树,在类 Unix 系统中不管增加了多少存储设备,都只有一个文件树系统,而这些存储设备会「挂载」到文件树的特定位置。

隐藏文件

在类 Unix 系统中在文件名的开头加上 . 就表示隐藏文件(如 .123.txt),单纯使用 ls 命令并不会显示它们,你可以加上 -a 参数:

$ ls -a

文件后缀名?

在 Linux 系统中没有「文件后缀名」的概念,所以不能以文件名来判定文件的用户或后缀,如不能以文件名为 .jpg 后缀就判定这是一个图片文件。

判断文件类型

那么怎么判断一个文件是什么类型?可以使用 file 命令:

$ file image.zip
image.zip: PNG image data, 1842 x 1370, 8-bit/color RGBA, non-interlaced

如上,我将一个图片文件以 .zip 为文件后缀名,依然是可以正确判断出文件类型的。

那么再来看一个命令:

$ file /home
/home: directory

你可能会惊讶于目录也可以用 file 命令判断?

「万物皆文件」

在类 Unix 系统中有一个「万物皆文件(everything is a file)」的概念。

可以使用 ls 命令加上选项 -l 得知指定目录下的文件都是什么文件类型,如:

# -l 表示以列表的形式列出
$ ls -l /boot
-rw-r--r-- 1 root root   236106 Mar  8 05:06 config-5.10.0-12-amd64
-rw-r--r-- 1 root root   236055 Oct  1 03:36 config-5.10.0-9-amd64
drwxr-xr-x 5 root root     4096 Mar 14 20:20 grub
-rw-r--r-- 1 root root 28262606 Mar 14 20:20 initrd.img-5.10.0-12-amd64
-rw-r--r-- 1 root root 28248487 Nov 22 18:44 initrd.img-5.10.0-9-amd64
-rw-r--r-- 1 root root       83 Mar  8 05:06 System.map-5.10.0-12-amd64
-rw-r--r-- 1 root root       83 Oct  1 03:36 System.map-5.10.0-9-amd64
-rw-r--r-- 1 root root  6837280 Mar  8 05:06 vmlinuz-5.10.0-12-amd64
-rw-r--r-- 1 root root  6833568 Oct  1 03:36 vmlinuz-5.10.0-9-amd64

上列每行开头就表示了这是一个什么类型的文件,如 d 表示目录,- 表示普通文件。

大多数文件系统实现定义了 7 种文件类型:

文件类型 符号
普通文件
目录 d
字符设备文件 c
块设备文件 b
本地域套接字 s
具名管道(FIFO) p
符号链接 l

操作文件和目录

mkdir——创建目录

mkdir (make directory)命令可以用于创建目录:

# 创建名为 Sites 的目录
$ mkdir Sites

# 当然也可一次创建多个目录,如一次性创建名为 Sites 及 Developer 两个目录
$ mkdir Sites Developer

cp——复制文件(及目录)

cp(copy)命令用于复制文件:

# 将名为 image.png 的图片文件复制成为一个备份文件
$ cp image.png image-1.png

# 将图片文件复制到当前目录下的子目录
$ cp image1.png image2.png Image

⚠️ 注意,在使用 cp 命令时,默认不会提示而直接覆盖同名文件,为了避免误操作,可以使用 -i 选项:

# 复制 image1.png 为 image2.png
$ cp -i image1.png image2.png
cp: overwrite 'image2.png'?

如上,当 image2.png 已经存在时,会提示 cp: overwrite 'image2.png'?,如果确认覆盖输入 y 并回车,反之输入 n 并回车。

cp 命令的一些实用选项:

选项 作用
-i –interactive 遇到同名文件覆盖前提示
-r –recursive 递归复制目录(即包括其子目录及内容),复制目录时需要改选项
-u –update 只处理目标目录中不存在或相比目标目录中现有文件更新的文件
-v –verbose 显示操作信息

mv——移动或重命名文件(及目录)

mv(move)命令用于移动或重命名目标文件:

# 如将某文件移动到目标目录
$ image.png Pictures

# 也可用于重命名文件
$ mv image.png sowrd.png

mv 命令的一些实用选项:

选项 作用
-i –interactive 遇到同名文件覆盖前提示
-u –update 只处理目标目录中不存在或相比目标目录中现有文件更新的文件
-v –verbose 显示操作信息

rm、rmdir——删除文件或目录

rm(remove)命令可用于删除文件:

$ rm image.png

rm 命令的一些实用选项:

选项 作用
-i –interactive 删除文件前显示确认提示
-r –recursive 递归删除
-f –force 忽略不存在的文件和参数
-v –verbose 显示操作信息

rmdir 命令可用于删除目录:

$ rmdir Downloads

# 如果要删除的目录非空,也就是存在文件,可以使用 --ignore-fail-on-non-empty 选项:
$ rmdir --ignore-fail-on-non-empty Downloads
# rm 命令使用 -rf 选项也可达到相同作用:
$ rm -rf Downloads