现代操作系统均是一个庞大体系,由众多组件构成。如何在众多组成元素中快速定位所期望的内容,是提高系统应用效率的关键。linux 也提供了众多方法,方便用户对所需元素的查询定位。
一、找文件
1. 找文件的位置
1.1. 文件位置查找的“重装备” — find
文件管理是操作系统的核心工作内容,文件查找在任何系统中都是最基本的需求之一。find 工具是 linux 系统文件查找的“重器”,其地位可见一斑。涉及查找工作,逃不出两个需求:1、找什么;2、在哪找。find 命令的格式也是以这两个要素为基础的:
find + 在哪找 + 找什么
find + (路径名) + (属性名 + 属性值)
“在哪找” 指出了查找的范围,一般由“一个或几个目录”指定; 而 “找什么” 指出了查找的内容,一般通过指定文件的某些属性来限定查找的内容。linux 文件的众多属性,为查询用户提供了各种查询条件(linux 文件有啥属性,我们就能查啥)。
(1) 常用查找属性有:
- 文件名称
- -name
- 文件属主
- -user / -group
- -uid / -gid
- -nouser / -nogroup
- 文件类型
- -type
- f — 普通文件
- d — 目录文件
- l — 链接文件
- b — 块设备文件
- c — 字符设备文件
- p — 管道文件
- s — socket文件
- -type
- 文件权限
- -perm
- mode_value — 精准权限
- +mode_value — 权限模糊匹配(包含 mode 中任一权限即可)
- -mode_value — 最小权限(目标权限只高不低,必须包括最小权限内容)
- eg. find / -perm +4000
找到所有具有 SUID 属性的文件
- -perm
除上述常见查找属性外,“文件大小” 和 “文件修改时间” 也是常用查找限定属性。
(2) 组合查找条件
当查找涉及多个属性,则可以利用条件连接符号来将多个查找条件组合到一起。
- -a (含义:and)
- -o (含义:or)
- -not
find 应用点滴
– 通配符
find 中可以使用通配符,以匹配更大的查找目标。
## 在 /home 目录下查找以 .txt 结尾的文件名
find /home -name "*.txt"
## 当前目录及子目录下查找所有以 .txt 和 .pdf 结尾的文件
find . -name "*.txt" -o -name "*.pdf"
– 文件路径中的元字符规避
find 查找目标中如包含特殊字符(如[
和 ]
),需要对其进行转义,以避免这些特殊字符被当做元字符处理。
## 直接显式查找包含 [ 和 ] 的文件名
find . -name 'ba[r]*pt-BR.srt*'
此时,应将 [ 和 ] 进行转义处理,改为
find . -name 'ba\[r\]*pt-BR.srt*'
## 包含 [ 和 ] 的文件名存储在变量中,可使用 printf 指令进行转义
filename=$(printf '%q' "$filename")
1.2. 文件位置查找的“轻武器”
1.2.1. 普通文件 快速定位 — locate
一提到文件查找,第一时间会想到 find。find 是强大的查找工具,它直奔主题,find 直接在硬盘查找,为此,其进行一次查找花费时间较多;而很多时候,我们期望快速查找某文件的位置,此时,linux 为我们提供了 locate。
locate + 具体文件名
为了提高文件查找的效率,linux 为硬盘上的文件集合提供了一种“索引缓冲”机制,即将系统内所有的文件都记录在一个数据库文件里面(/var/lib/mlocate/),当使用 locate 进行查找时,不直接去硬盘中访问数据,而是到创建的数据库(/var/lib/mlocate)中去查找,使用此种“缓冲”机制,极大提升了查找的速度。
使用“缓冲”机制带来效率的同时,也引入了“缓冲”机制与生俱来的缺陷,即“缓冲区”更新的问题。“缓冲区”(创建的文件数据库)如更新不及时,则可能导致诸如查找到已经不存在的文件(被删除)、新创建的文件找不到等问题。此时,最有效的方法就是更新“缓冲区”。文件数据库既可以自动更新(不同 distribution 更新策略不同),也可以手动更新(基于 /etc/updatedb.conf 的 updatedb 命令)。
locate本质上是一种 “缓冲区查找”。
1.2.2. 命令文件 快速定位 — whereis, type, which
针对命令文件,linux 提供了丰富的手段进行查找定位。
1) 命令文件 — 全要素 快速定位
在 linux 系统中的一个命令文件(某种程度也可视为一个工具),除了最基本的二进制执行文件外,通常还包括命令的配置文件、库文件、源代码文件、命令的用户手册文件等等。whereis 为我们提供了查找一个命令全要素的有力手段,通过 whereis,我们可以掌握一个命令在系统中静态安装的全貌。
whereis + 具体命令
直接调用上述命令,会展示命令在系统中静态存储全要素信息,一般显示顺序为“二进制文件存储路径、配置文件路径、库文件路径、用户手册文件路径、源代码文件路径”。
主要参数:
- -b — 查找命令的二进制文件
- -m — 查找命令的手册文件
- -s — 查找命令的源代码文件
与 locate 一样,whereis 本质上也是一种 “缓冲区查找”。
2) 命令文件 — 二进制文件路径 快速定位
我们在shell中使用各种命令,经常想要知道命令的具体存储路径,此时就到了 type/which 现身手的时候了:
type/which + 具体命令 (如apktool)
使用上述指令,就可在 shell 中显示具体命令在文件系统中的存储位置。
相对 which,type 的返回信息更为全面:
- 如果没有查到,which 不会有任何返回,而 type 则会给出提示;
- 对于 shell 内置命令(如 cd),which 不会给出任何信息(只针对 PATH 内所规定目录范围查找),而 type 则会明确提示(a shell builtin)
2. 找文件的属性
2.1. 查找文件 MIME 类型
linux 中,所有的资源都是以文件的形式存在的,这些文件以各种类型存在,有的是二进制文件,有的是文本文件等等。为了使用方便,并与相应的打开应用程序关联,还为每个文件都定义了更为细粒度划分的 MIME 类型。为方便相应文件类型的查看,linux 也提供了便捷的手段。
file + 全路径文件
使用 file 可简单直接判定一个文件的类型。
file – i / –mime-type + 全路径文件
xdg-mime query filetyp + 全路径文件
使用 file -i 和 xdg-mime,可进一步确定文件的 MIME 类型。
2.2. 命令文件 隶属软件包定位
使用 linux 指令,经常需要了解指令来自哪一个软件包,方便指令系统的管理。linux 也提供了相应的手段。
- 先用命令定位工具(type/which/whereis)找到命令文件的存储路径
- 利用不同发布版的软件包管理工具查找命令文件的属主软件包
- fedora系
rpm -qf 全路径命令文件
- ubuntu系
dpkg -S 全路径命令文件
- fedora系
二、找设备
linux 也提供了多种手段,帮助用户查找计算机系统各种总线上的设备信息。这些信息帮助用户了解所使用计算机系统中各设备的基本情况,在驱动更新、设备升级时,这些内容可提供非常有用的信息。
1. 找 PCI总线 上的设备
- lspci — 列出 PCI 总线上的所有设备信息
常用选项:
- -vv
Be very verbose and display more details. This level includes everything deemed useful. - -nn
Show PCI vendor and device codes as both numbers and names.
PCI 总线连接了许多重要设备,比如常见笔记本计算机的显卡、无线网卡等设备都是通过 PCI 总线接入计算机系统中的。通过 lspci 命令即可查看这类相关设备的详细信息。
- -vv
2. 找 USB总线 上的设备
- lsusb — 列出 USB 总线上的所有设备信息
3. 找字体
- fc-list — 列出系统安装的所有字体
三、找用户
linux 是多用户操作系统,为高效管理诸多用户,linux 引入了用户和用户组模型(具体信息记录在 /etc/passwd、/etc/shadow、/etc/group、/etc/gshadow 几个文件中)。快速查找用户信息也是实际应用中的常见需求。
1. id — 找 id
顾名思义,id 为快速查找用户 id 提供了有力手段。通过
id + [用户名]
可以找出用户的 id、gid (initial group id)、用户所在所有用户组的组 id 等相关信息。
如果 id 单独使用,后面不接具体用户名,则使用的“反射”用法,显示当前用户自己的 id 相关信息。
四、查看系统信息
1. neofetch
neofetch 是一个查看全面系统信息的脚本。
2. 查看内核信息
uname -a
3. 查看 Linux 发行版本
lsb_release -a