软件安装与文件操作
发布时间:2026-08-27 | 浏览:1
面对一个新的系统,你要怎样将它尽快地投入使用?通过这一章节的学习,你将会掌握以下几个技能:
对文件与目录进行创建、移动、删除等
对没有使用过的软件能够更快地了解使用方法
软件安装的方法较多,这里将会提到几个比较常用的软件安装方法:
使用应用商店安装比较符合我们在 Google Play 和 App Store 安装应用的习惯,无需用户的干预,只需轻点鼠标即可完成安装。
在 Ubuntu 下,我们可以使用 Ubuntu Application Store 来进行安装,下图为应用商店中的 VSCode 应用页面。
本节中提到的这种方法常见于自带应用商店的发行版,如 Ubuntu、Manjaro 等。
在其他的发行版上,如果没有预装好的应用商店,可以安装 Snapcraft 或 Flatpak 等在不同发行版上通用的应用商店。(注意:Snap 商店在国内的访问速度较慢。)
软件包管理器是一系列工具的集合,它自动化地完成软件的安装、更新、配置和移除功能。
在 Linux 下,相比起使用应用商店安装软件,包管理系统的使用要更加广泛,许多软件均可以通过一行命令完成其安装,优雅而快速。
软件包管理器的一个重要组成部分是软件仓库。软件仓库是收藏了互联网上可用软件包(应用程序)的图书馆,里面往往包含了数万个可供下载和安装的可用软件包。 1
有了软件仓库,我们不需要手动下载大量的软件包再通过包管理器安装。只需要知道软件在软件仓库中的名称,即可让包管理器从网络中抓取到相应的软件包到本地,自动进行安装。
但是与应用商店相比,使用包管理器安装需要预先知道所需软件在软件仓库中的对应包名,和应用商店相比无法进行模糊搜索(不过你也可以在包管理器官网或者通过包管理器的命令行前端查找包名,再通过包管理器安装)。
包管理系统有很多,比如管理 Debian (.deb) 软件包的 dpkg 以及它的前端 apt (用于 Debian 系的发行版); rpm 包管理器以及它的前端 dnf (用于 Fedora 和新版的 CentOS 和 RHEL)、前端 yum (用于 CentOS 7 和 RHEL 7 等); pacman 包管理器(用于 Arch Linux 和 Manjaro)等等。
为了方便讲述,本章下文中我们都将以 apt 作为典型实例进行讲解。
apt 的全称是 Advance Package Tool,是一个处理在 Debian、Ubuntu 或者其他衍生发行版的 Linux 上安装和移除软件的自由软件。
apt 可以自动下载、配置和安装二进制或者源代码格式的软件包,简化了在这些发行版上管理软件的流程。因此,它常常用来安装软件、自动处理软件包之间的依赖关系、升级软件包以至升级发行版,自动处理升级发行版所需的依赖关系等等。
此外用户可以自定义软件源(软件仓库),自由地添加第三方源来安装官方软件源中没有的软件或者安装特定版本的软件。
安装前,可以在浏览器中搜索所需的软件,查找包名,也可以使用 apt search 命令搜索软件仓库,查看对应的包名是否在软件仓库中。使用方法: apt search <搜索内容> 。
下面是 apt search firefox 搜索火狐浏览器的输出结果示例,由于输出结果过多,去除了无用的其他软件包:
在确定了软件包的包名后,可以通过 apt install <包名> 安装软件包。如果需要一次性安装多个包,可以用 apt install <包名1> <包名2> ... 的写法。
下面是 apt install firefox 安装火狐浏览器的输出结果示例。
在运行结果中,会给出将会安装的软件包、下载大小以及安装后占用的大小。输入 Y 后回车确定进行安装。
在一般情况下,如果直接运行 apt install 命令,会输出
这是由于当前用户的权限无法满足安装软件所需的权限。修正方法:在命令前面添加 sudo 。
即使用 sudo apt install firefox 。
这里提示的是需要用户输入密码,以提升权限来执行命令。
当然,在用户输入密码的过程中,为了安全,终端是不会进行密码的回显的,即终端不会将用户的输入内容打印在屏幕上。
因此当你发现自己输入了很多内容也没有什么反应的时候,不用惊慌,只需要像平常一样输入正确的密码、回车,即可完成密码的正确性的鉴定。
如果密码输入正确,那么就可以正常地执行命令。
具体有关权限的知识点将在 第五章 展开。
如果不希望 apt 询问是否安装,可以使用:
这在编写无交互的 自动化脚本 时特别好用(例如那些能自动安装一系列依赖包的安装脚本)。但是,在这些脚本中,建议使用 apt-get ,因为相对古老的 apt-get 的命令行参数比较稳定,而 apt 则有可能会变化,这对脚本的向后兼容性是不利的。
通过 apt 安装的软件都来源于相对应的软件源,每个 Linux 发行版一般都带有官方的软件源,在官方的软件源中已经包含了丰富的软件,apt 的软件源列表在 /etc/apt/sources.list 下。
分别是 Archive type、Repository URL、Distribution 和 Components。
在 Ubuntu 下,Component 可以为如下几个之一 1 :
具体的含义见 Source List
Ubuntu 官方源位于国外,往往会有速度与延迟上的限制,可以通过修改官方源为其镜像实现更快的下载速度。
镜像缓存了官方源中的软件列表,与官方源基本一致。
修改官方源为镜像,加快更新速度
本例以修改官方源为 USTC Mirror 为例 2 。 注意:在操作前请做好备份。
一般情况下, /etc/apt/sources.list 下的官方源地址为 http://archive.ubuntu.com/ ,我们只需要将其替换为 http://mirrors.ustc.edu.cn 即可。
如果你使用 Ubuntu 图形安装器安装,默认的源地址通常不是 http://archive.ubuntu.com/ , 而是 http://<country-code>.archive.ubuntu.com/ubuntu/ ,如 http://cn.archive.ubuntu.com/ubuntu/ ,同样也将其替换为 http://mirrors.ustc.edu.cn 即可。
当然也可以直接使用 vim 、 nano 等文本编辑器进行修改。
有时候,由于种种原因,官方软件源中并没有我们需要的软件,但是第三方软件提供商可以提供自己的软件源。在将第三方软件源添加到 /etc/apt/sources.list 中之后,就可以获取到第三方提供的软件列表,再通过 apt install package-name 安装我们需要的第三方软件。你一般可以在需要的第三方软件官网找到这样的配置说明。
Docker 是一个十分流行的容器实现,常见于开发、交付、运行应用,极大地简化了部署应用的流程。关于 Docker 将在本书 第八章 进行专门的介绍。
在各大软件源中已经提供了 Docker,在 Ubuntu/Debian 下的包名为 docker.io 。
Docker 官方也提供了自己的软件源,包名为 docker-ce ,它的版本会稍微更新一些。我们可以通过添加 Docker 的软件源到 /etc/apt/sources.list 中来进行安装。以下安装流程按照 Docker 官方文档 展开。
安装需要的的软件包 $ sudo apt-get update # 更新本地的包列表 $ sudo apt-get install \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
下载 Docker 软件源的 GPG Key 这一步将 GPG Key 添加到系统目录中。GPG Key 用于验证软件源的完整性,如果下载的文件被篡改,GPG 签名验证会失败,从而系统不会继续进行安装操作,防止有问题的软件包进入系统。 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
下载 Docker 软件源的 GPG Key
这一步将 GPG Key 添加到系统目录中。GPG Key 用于验证软件源的完整性,如果下载的文件被篡改,GPG 签名验证会失败,从而系统不会继续进行安装操作,防止有问题的软件包进入系统。
添加 Docker 软件源到 /etc/apt/sources.list.d/ 中 为了方便维护,第三方的 APT 软件源一般都放在 /etc/apt/sources.list.d/ 目录下(而非直接编辑 /etc/apt/sources.list )。 $ echo \ "deb [arch= $( dpkg --print-architecture ) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $ (lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 这里通过 dpkg --print-architecture 命令获取系统当前的架构, lsb_release -cs 命令获取当前的系统代号(Codename),通过 Shell 命令拼接后保存到 /etc/apt/sources.list.d/docker.list 文件中。
添加 Docker 软件源到 /etc/apt/sources.list.d/ 中
为了方便维护,第三方的 APT 软件源一般都放在 /etc/apt/sources.list.d/ 目录下(而非直接编辑 /etc/apt/sources.list )。
这里通过 dpkg --print-architecture 命令获取系统当前的架构, lsb_release -cs 命令获取当前的系统代号(Codename),通过 Shell 命令拼接后保存到 /etc/apt/sources.list.d/docker.list 文件中。
使用 apt 安装 Docker 首先需要从第三方源更新软件列表。 $ sudo apt update 之后便可以直接安装 docker-ce 以及相关的软件包。 $ sudo apt install docker-ce docker-ce-cli containerd.io
使用 apt 安装 Docker
首先需要从第三方源更新软件列表。
之后便可以直接安装 docker-ce 以及相关的软件包。
检查安装情况并确认启动 Docker 是作为一个服务运行在系统的后台的,要查看 Docker 是否安装完成并确定 Docker 已经启动,可以通过如下方式: $ sudo systemctl status docker 如果 Docker 已经在后台启动了,则会输出与下面相似的内容: ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-04-10 20:55:27 CST; 18h ago Docs: https://docs.docker.com Main PID: 1115 (dockerd) Tasks: 18 CGroup: /system.slice/docker.service └─1115 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 如果没有启动,则会输出类似于这样的结果: ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: inactive (dead) since Sat 2020-04-11 15:43:02 CST; 4s ago Docs: https://docs.docker.com Process: 1115 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/ Main PID: 1115 (code=exited, status=0/SUCCESS) 这时候,我们可以通过 systemctl 命令启动 Docker 服务: $ sudo systemctl start docker 再次检查 Docker 运行情况,即应该可以得到期望的结果。关于服务相关的内容,将在本书 第四章 展开。
Docker 是作为一个服务运行在系统的后台的,要查看 Docker 是否安装完成并确定 Docker 已经启动,可以通过如下方式:
如果 Docker 已经在后台启动了,则会输出与下面相似的内容:
如果没有启动,则会输出类似于这样的结果:
这时候,我们可以通过 systemctl 命令启动 Docker 服务:
再次检查 Docker 运行情况,即应该可以得到期望的结果。关于服务相关的内容,将在本书 第四章 展开。
在计算机本地,系统会维护一个包列表,在这个列表里面,包含了软件信息以及软件包的依赖关系,在执行 apt install 命令时,会从这个列表中读取出想要安装的软件信息,包括下载地址、软件版本、依赖的包,同时 apt 会对依赖的包递归执行如上操作,直到不再有新的依赖包。如上得到的所有包,将会是在 apt install some-package 时安装的。
为了将这个列表进行更新,就会用到 apt update 命令。获取到新的软件版本、软件依赖关系。
在 apt 的配置中,有许多的软件源,每一个软件源都会提供一定数量的包列表。通过增添软件源,即可实现通过 apt 安装官方源中并不提供的软件或版本。
apt update 输出样例
在最后, 158 packages can be upgraded 表示了系统中可以被更新的软件包的数量。
在获取到了新的软件列表后,可以进行软件更新,这时候使用的是 apt upgrade 命令。
apt upgrade 会根据软件列表中的版本信息与当前安装的版本进行对比,解决新的依赖关系,完成升级。
apt upgrade 输出样例
apt 会列出将要更新的软件包、需要下载的大小以及更新这些包需要消耗(或释放)的磁盘空间。
使用包管理器手动安装软件包 ¶
在一些情况下,软件仓库中并没有加入我们所需要的软件。除了添加第三方软件源,从源安装外,有时候还可以直接下载安装软件供应商打包好的 deb 、 rpm 等二进制包。
软件包是将软件安装升级中需要地多个数据文件合并得到的一个单独文件,便于传输和减少存储空间。软件包中包括了所有需要的元数据,如软件的名称、软件的说明、版本号以及要运行这个软件所需要的依赖包等。
安装软件包需要相应的软件包管理器,deb 格式的软件包对应的是 dpkg 。
相对于 apt 而言, dpkg 会更加底层, apt 是一个包管理器的前端,并不直接执行软件包的安装工作,相反的则是交由 dpkg 完成。 dpkg 反馈的依赖信息则会告知 apt 还需要安装的其他软件包,并从软件仓库中获取到相应的软件包进行安装,从而完成依赖管理问题。
直接通过 dpkg 安装 deb 并不会安装需要的依赖,只会报告出相应的依赖缺失了。
请避免直接使用 dpkg -i 安装 deb 包。
在绝大多数情况下,都应该使用 apt 来安装 deb 文件。
如果不小心执行了 dpkg -i 导致系统出现依赖问题,可以尝试通过如下的方式调用 apt 帮助修复依赖管理:
用 deb 文件安装 VSCode
Visual Studio Code 并不在 Ubuntu 的官方源中,可以通过安装微软提供的 deb 文件的方式进行安装。
首先,下载 微软提供的 deb 文件 。
然后运行 apt install ./<file>.deb ( <file>.deb 为下载得到的 deb 文件)。
对于用户数量较多的发行版,软件提供商还可能提供预编译好的二进制文件,可以直接运行。对于没有在软件仓库中提供的软件,免去了从源码编译安装的麻烦。
下面我们以 LLVM 为例作介绍。LLVM 是一个编译器组件工具集,可以帮助开发者开发编译器以及周边工具。
注:使用 LLVM 需要其前端 Clang。Clang 在 apt 上有提供,使用 apt install clang (或对应版本的 clang 包名)命令安装即可。
在 LLVM 的 Prebuilt 下载页面 中下载需要的版本以及自己的发行版所对应的二进制文件(Pre-Built Binaries)。在 “LLVM 16.0.0” 栏目下跳转到对应的 GitHub Release 页面,可以获取到最低兼容 Ubuntu 18.04 的预编译二进制文件。
在进入解压得到的目录后,可以查看当前的目录下有什么内容:
一般而言,软件的可执行文件都位于 bin 目录下:
这个目录下的 clang 和 clang++ 就类似于我们比较熟悉的 gcc 和 g++ 。这两个是可以直接运行进行编译源代码的可执行文件。当然,我们不能每次在需要编译程序的时候输入如此长的路径找到 clang 和 clang++ ,而更希望的是能够像 apt 命令下载的程序那样在任何地方都可以直接运行。我们可以这样做:
在这里我们需要知道什么是 PATH 变量,当我们在终端输入命令时,终端会优先判断是否为终端的内建命令,如果不是,则会在 $PATH 环境变量中包含的目录下进行查找。因此,只要我们将一个可执行文件放入了 $PATH 中的目录下面,我们就可以在任意地方调用我们的程序。那为什么是不直接将 clang 目录下的内容直接复制到 /usr/local 下呢?这么做虽然能让 clang/bin 目录下的二进制文件与 /usr/local/bin/ 合并,从而实现“到处可调用”,但同时也会把解压的 clang 目录下的 lib 、 include 、 share 等目录混入系统已有的 /usr/local/lib 、 /usr/local/include 等目录中。这种方法针对那些只有单一的二进制编译执行程序来说是简单省事的,但由于 clang 有很多版本,并且 clang 软件规模较大、较复杂,有很多文件,这么做会带来麻烦:安装的 clang 无法进行有效的版本管理,后续卸载也很困难,因此像 clang 这样的复杂软件,并不推荐直接安装到 /usr/local 。更推荐的做法是单独在 /usr/local/ 下单独创建一个属于 clang 的部署目录,并且标注好版本号,这样也更方便后续的版本管理与维护工作:
这两条命令将当前 clang-16.0.0 目录添加到 PATH 环境变量中。通过这个命令可以看到当前的 PATH 环境变量有哪些目录。
这里我们可以注意到,新创建的 /usr/local/clang-16.0.0 目录已经添加到了 PATH 环境变量中,现在就可以在任意地方调用我们下载的二进制编译的程序。
对于手工从 Internet 或者其他来源获取到的软件,在使用前务必注意检查其完整性(例如检查压缩文件的 hash 和官方网站上提供的是否一致)和安全性。运行有问题的程序,或者特别是安装有问题的程序(例如上面那样安装到 /usr/local ),会导致系统安全受到损害。如非必要,请尽可能使用包管理器从官方软件源中安装软件。
关于软件包管理器的更多用法可查看 Pacman/Rosetta 页面,该页展示了一些流行的 Linux 发行版包管理器命令以及命令操作内容的对应关系。
此部分内容请见拓展阅读: 编译安装 。
在 Linux 中进行操作文件与目录是使用 Linux 最基础的一个技能。不像在 Windows 和 macOS 下有图形化界面,拖拽文件即可完成文件的移动,很容易管理文件与目录,Linux 的命令行操作虽然繁琐一些,但一旦上手,就可以通过命令与参数的组合完成通过图形化界面难以实现或者无法实现的功能。
第二章 已经介绍过 ls 的基本用法,这里再补充一些常用的选项。
tree 命令可以以树状图的形式显示目录结构,使用前需要先安装:
eza 是一个 ls 的替代品,输出更加好看。在 Ubuntu 24.04 及以上版本中可以使用如下命令安装:
其使用方法和 ls 基本相同,例如显示详细信息则使用 eza -l 。
当然和猫咪没有关系,cat 这里是 con cat enate(连接)的缩写,因为 cat 工具实际的功能是连接多个文件,然后输出。但是当只有一个文件的时候,cat 就会直接输出这个文件,所以 cat 最常见的用途就是输出单个文件。
bat 是一个 cat 的替代品,输出支持语法高亮和分页。可以使用如下命令安装:
在 Debian/Ubuntu 下,该命令需要使用 batcat 调用。例如,输出 sol1.c 文件的内容(支持 C 语言语法高亮):
less 和 cat 的区别在于,cat 会一次性打印全部内容到终端中并退出,而 less 一次只显示一页,且支持向前/后滚动、搜索等功能。如果要在一个大文件中(例如 man page)查找一部分内容,less 通常要比 cat 方便得多。
其中移动光标的快捷键还可以和数字组合,例如 10 j 会向下移动十行。此外,less 的不少快捷键是和 Vi/Vim 相同的,掌握了这些快捷键再上手 Vim 就会简单很多(Vim 的介绍位于本章 拓展阅读 内)。
实际上 Linux 内还有 more 与 most 两个功能与 less 相似的指令,只是流行程度不如 less 高,你也可以尝试这些指令,比较它们之间的区别。
Nano 是在很多机器上自带的命令行文本编辑器,相比于 vim 和 emacs 来说,对新手更加友好,不需要提前记忆复杂的键位。如果 Nano 没有被默认安装,则可以通过 apt 来安装。
Nano 启动后,用户可以直接开始输入需要的内容,使用方向键移动光标。在终端最下方是 nano 的快捷键, ^ 代表需要按下 Ctrl 键(例如, ^X 就是需要同时按下 Ctrl + X)。在编辑完成后,按下 Ctrl + X,确认是否保存后即可。
本章的 拓展阅读 也简单介绍了 vim 的基础使用。
cp 的 -l 和 -s 参数分别为创建硬链接和软链接(又称为“符号链接”)。
简单而言,一个文件的硬链接和软链接都指向文件自身,但是在底层有不同的实现。
需要先了解一个概念:inode。
在许多“类 Unix 文件系统”中,inode 用来描述文件系统的对象,如文件和目录。inode 记录了文件系统对象的属性和磁盘块的位置。可以被视为保存在磁盘中的文件的索引(英文:index node)。
关于 inode 的进一步讲解可以参考 这篇文章 。
硬链接与源文件有着相同的 inode,都指向磁盘中的同一个位置。删除其中一个,并不影响另一个。
软链接与源文件的 inode 不同。软链接保存了源文件的路径,在访问软链接的时候,访问的路径被替换为源文件的路径,因此访问软链接也等同于访问源文件。但是如果删除了源文件,软链接所保存的路径也就无效了,软链接因此也是无效的。
ln 命令也可以用来创建硬链接和软链接。
mv 与 cp 的使用方式相似,效果类似于 Windows 下的剪切。
mv 命令可以作为对文件或目录重命名的方式。例如, mv oldname newname 可以将 oldname 的文件或目录重命名为 newname 。
使用 rm 删除时,请务必注意目录拼写。例如:
为什么名字叫 touch 而非 create(或者类似意思的单词)呢?
touch 工具实际上的功能是修改文件的访问时间(access time, atime)和修改时间(modification time, mtime),可以当作是摸(touch)了一下文件,使得它的访问与修改时间发生了变化。当文件不存在时,touch 会创建新文件,所以创建文件也就成为了 touch 最常见的用途。
stat 命令可以显示文件的属性信息,可以来看看 touch 对已有文件的操作:
如果不添加任何其他选项,find 会递归地输出提供的 PATH 下的所有文件。
find 的一个很有用的用法是对每一个文件都执行某个命令(例如 md5sum ):
这里, find . 是指对当前目录( . )进行 find ,并只列出文件( -type f )。 -exec 后面的内容是要执行的命令,其中 {} 会被替换成找到的对象(文件、目录)的路径, \; 表示对每个对象都执行一次给定的命令,即实际运行的是:
如果将 \; 换成 + ,那么就是将文件名称收集起来一并交给要执行的命令,即:
fd 是 find 的更现代、好用的替代。在 Ubuntu 下需要安装 fd-find 包,并且命令名为 fdfind (而非 fd )。
其默认接受正则表达式(见 第九章 )作为搜索条件,例如搜索结尾为 .conf 的文件:
du 命令可以统计文件和目录的大小,因为目录的大小是无法直接获取的,需要统计里面所有的文件和子目录的大小之后加和才能得到。
du 需要先递归进入子目录,处理完其中所有的项目之后,才能回到上层目录并显示上层目录的总大小。
此外, ncdu 命令可以以图形化和交互式的方式显示目录的内容和大小,并可以用左右方向键浏览目录,类似 Windows 的文件资源管理器。这非常便于观察哪个目录占用了较大的磁盘空间。按 d 可以删除当前选中的文件或目录,按 q 退出。
许多现代的 shell 都支持一定程度的模式匹配。举个例子,bash 的匹配模式被称为 glob ,支持的操作如下:
和上面提到的命令结合,可以显著提高操作效率。例如:
使用通配符前请再三确认输入无误,否则可能出现严重的后果(如 rm -rf * 会删掉当前目录的所有文件)。
除了上面提到的 glob,bash 还支持 extglob ,不过需要先用 shopt -s extglob 启用。
其他 shell 例如 zsh 还支持正则表达式(会在后续章节讲解)。
使用 tar 操作存档、压缩文件 ¶
经常,我们希望将许多文件打包然后发送给其他人,这时候就会用到 tar 这个命令,作为一个存档工具,它可以将许多文件打包为一个存档文件。
通常,可以使用其自带的 gzip 或 bzip2 算法进行压缩,生成压缩文件:
添加压缩选项可以使用压缩算法进行创建压缩文件或者解压压缩文件:
与大部分 Linux 命令相同,tar 命令允许将多个单字母(使用单个 - 符号的)选项组合为一个参数,便于用户输入。例如,以下命令是等价的:
后缀名并不能决定文件类型,但后缀名通常用于帮助人们辨认这个文件的可能文件类型,从而选择合适的打开方法。
在 tar -c -f target.tar file1 file2 file3 这个例子中,创建得到的文件名为 target.tar ,后缀名为 tar ,表示这是一个没有进行压缩的存档文件。
在 tar -cz -f target.tar.gz file1 file2 file3 这个例子中,创建得到的文件名为 target.tar.gz 。将 tar.gz 整体视为后缀名,可以判断出,为经过 gzip 算法压缩( gz )的存档文件( tar )。可知在提取文件时,需要添加 -z 选项使其经过 gzip 算法处理后再进行正常 tar 文件的提取。
同样地,通过不同压缩算法得到的文件应该有不同的后缀名,以便于选择正确的参数。如经过 xz 算法处理得到的存档文件,其后缀名最好选择 tar.xz ,这样可以知道为了提取其中的文件,应该添加 --xz 选项。
为什么使用 tar 创建压缩包需要“两次处理”
tar 名字来源于英文 t ape ar chive,原先被用来向只能顺序写入的磁带写入数据。tar 格式本身所做的事情非常简单:把所有文件(包括它们的“元数据”,包含了文件权限、时间戳等信息)放在一起,打包成一个文件。 注意,这中间没有压缩的过程。
为了得到更小的打包文件,方便存储和网络传输,就需要使用一些压缩算法,缩小 tar 文件的大小。这就是 tar 处理它自己的打包文件的逻辑。在 Windows 下的一部分压缩软件中,为了获取压缩后的 tar 打包文件的内容,用户需要手动先把被压缩的 tar 包解压出来,然后再提取 tar 包中的文件。
面对一个新的软件,比如上面提到的 tar 存档软件,除了使用搜索引擎在互联网上搜索使用方法外,还可以通过软件安装时自带的使用文档来学习。
掌握通过一些手段了解一个新的命令的使用方法的技能在 Linux 学习中是极其重要的,Linux 的命令众多,并不会有很多的命令会有详细的说明。有时候官方文档也没有解释清楚的,可能需要手动试错乃至翻阅源代码了解命令的参数含义。
通过 man 命令名 可以得到大部分安装在 Linux 上的软件的用户手册。
大部分软件在安装时会将它的软件手册安装在系统的特定目录, man 命令就是读取并展示这些手册的命令。在软件手册中,会带有软件的每一个参数的含义、退出值含义、作者等内容,大而全。但一般较少带有使用样例,需要根据自身需要拼接软件参数。
文档中,往往会有命令的参数组合以及参数的详细含义,大而全能够很好地描述它,但是这对于我们希望能够快速上手一个命令是不利的,这就需要后面的另一个工具 tldr 。
对于单行的命令,可以使用 Explain Shell 解释命令和参数的含义、作用。Explain Shell 通过预先解析 Ubuntu 的 man 文档实现了相关功能。
通常,软件手册中的内容十分繁多,如果只是希望能够快速了解软件的常用用法,可以使用 tldr 软件。
tldr 软件中包含有一个由 社区 维护的精简版文档,通过几个简单的例子让用户可以快速地一窥软件的使用方法。
在 Debian 系下,可以直接通过 apt 进行安装:
Debian 13 中关于 tldr 包更新的说明
需要指出的是,在 Debian 13 (Trixie) 发行版中,原有的 tldr 包(使用 Haskell 实现)已经被移除。 3 取而代之的是 tldr-py 包(使用 Python 实现)和 tealdeer 包(使用 Rust 实现),它们仍然提供 tldr 命令,因此使用方式不变。
考虑到 Linux 101 是基于 Ubuntu LTS 的,我们目前在正文中保留原有的安装命令。读者可以使用 apt search tldr 来查询自己版本所支持的相关包,具体用法参见前文。
直接输入 tldr 命令名 即可。由于是由社区维护的,一些自行安装的软件可能不会有精简过的文档。
输入 tldr tar 的样例:
创建一个存档文件,并通过给定的目标存档文件的后缀名判断希望的压缩算法。在例子中,目标存档文件的后缀名是 tar.gz ,即希望创建由 gzip 压缩的存档文件;
给出一个存档文件中的文件列表;
解压一个存档文件,但是只有特定的文件名的文件才会被解压(在例子中,使用了通配符 *.html ,即只有以 .html 结尾的文件才会被解压)。
在本章 软件的使用文档 一节中,我们介绍了两个十分有用的文档命令: man 和 tldr 。这两个工具帮助我们详细或快速了解一个命令的功能和用法。
那么 man 和 tldr 的用法又要怎么查看呢?
有时候,你会发现缺少了一些文件,而这些文件需要安装特定的软件包来补充。搜索资料,尝试说明如何方便地解决这样的问题。
搜索资料,尝试说明如何判断一个文件是否有硬链接,或者是否是软链接。
错误使用 tar 命令导致的文件丢失
这是一个真实的故事。某同学希望打包一些文件传输给另一位同学,于是他执行了下面这条命令:
这会导致什么后果?尝试解释原因。(提示: * 代表当前目录下的所有文件,这个符号在执行之前会被 Shell 展开。)
为什么 mv 命令不需要 -r (recursive) 参数
而 cp 命令在复制包含文件的目录时则需要使用 -r 参数。为什么 mv 命令不需要 -r 参数?
为什么不建议使用 apt-key
在 2020 年初撰写本章时,“第三方软件源”中安装 Docker 的示例中使用了 apt-key 添加信任的 GPG Key,如下所示:
但是如今可以注意到,Docker 官方的安装教程也不再使用此方式,转而先手动下载、经过 gpg 程序处理后放置在 /usr/share/keyrings/ 下,然后在软件源配置文件中使用 signed-by 参数指定成这个文件。为什么要换成这么麻烦的步骤?
背景知识:GPG 签名是非对称密码体系的一个例子。这里,软件包发布者有两把密钥:公钥(供用户公开下载)和私钥(必须妥善保存,不能让别人知道)。发布者使用 私钥 对软件包签名后,用户可以用 公钥 验证软件包确实为该发布者发布,且未被篡改。
提示:私钥泄漏之后可能会发生什么?
Debian 13 发布说明:已废弃软件包 ↩
Debian 13 发布说明:已废弃软件包 ↩