“查找”的学问


现代操作系统均是一个庞大体系,由众多组件构成。如何在众多组成元素中快速定位所期望的内容,是提高系统应用效率的关键。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文件
  • 文件权限
    • -perm
      •   mode_value — 精准权限
      • +mode_value — 权限模糊匹配(包含 mode 中任一权限即可)
      • -mode_value — 最小权限(目标权限只高不低,必须包括最小权限内容)
    • eg. find / -perm +4000
      找到所有具有 SUID 属性的文件

除上述常见查找属性外,“文件大小” 和 “文件修改时间” 也是常用查找限定属性。

(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 也提供了相应的手段。

  1. 先用命令定位工具(type/which/whereis)找到命令文件的存储路径
  2. 利用不同发布版的软件包管理工具查找命令文件的属主软件包
    • fedora系

      rpm -qf 全路径命令文件

    • ubuntu系

      dpkg -S 全路径命令文件

二、找设备

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 命令即可查看这类相关设备的详细信息。

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注