查找文件与快速定位

现在回到值班任务:需要在 /srv/ops 目录下核对数据库备份文件。

我们先查看 /srv/ops 目录的结构:

crow@opsbox:~/work$ ls /srv/ops
backups
deploy.conf
practice
crow@opsbox:~/work$ ls /srv/ops/backups
2026-06
2026-07

备份文件按月份归档在不同子目录中。如果目录层级很深、文件数量成百上千,逐层手动寻找会非常低效。这时可以使用 find 命令快速定位文件。

使用 find 定位文件

以六月三十日的备份文件为例:

crow@opsbox:~/work$ find /srv/ops/backups -type f -name 'db-2026-06-30.sql'
/srv/ops/backups/2026-06/db-2026-06-30.sql

find 命令的常用参数可以这样理解:

  • /srv/ops/backups:从该目录开始递归查找;
  • -type f:只查找普通文件,排除目录等其他类型;
  • -name 'db-2026-06-30.sql':按文件名匹配。如果文件名中包含通配符,建议用单引号包裹,避免被 Shell 提前展开。

如果不确定具体日期,只记得是 2026 年 6 月的 SQL 备份,可以使用通配符 *:

crow@opsbox:~/work$ find /srv/ops/backups -type f -name 'db-2026-06-*.sql'
/srv/ops/backups/2026-06/db-2026-06-29.sql
/srv/ops/backups/2026-06/db-2026-06-28.sql
/srv/ops/backups/2026-06/db-2026-06-30.sql
/srv/ops/backups/2026-06/db-2026-06-27.sql

输出顺序可能取决于 find 遍历目录的顺序,不一定按日期排列。

还可以继续添加过滤条件。例如:

  • -user crow:只查找所有者为 crow 的文件;
  • -size +10k:只查找大小超过 10 KiB 的文件;
  • -mmin -10:只查找最近 10 分钟内修改过的文件。

如果需要忽略文件名大小写,可以使用 -iname 代替 -name。

预览文件并统计行数

找到备份文件后,正式查看前可以先了解文件规模和开头内容:

crow@opsbox:~/work$ wc -l /srv/ops/backups/2026-06/db-2026-06-30.sql
305 /srv/ops/backups/2026-06/db-2026-06-30.sql
crow@opsbox:~/work$ head -n 3 /srv/ops/backups/2026-06/db-2026-06-30.sql
-- opsbox nightly dump  2026-06-30
-- generated by /usr/local/bin/nightly-backup.sh
CREATE TABLE users (id INT, name TEXT, role TEXT);

常见命令说明:

  • wc -l:统计文件行数,这里显示共 305 行;
  • head -n 3:查看文件开头的 3 行;
  • tail -n 3:查看文件末尾的 3 行;
  • less /srv/ops/backups/2026-06/db-2026-06-30.sql:逐屏阅读长文件。进入后可以用上下方向键或空格键翻页,输入 /关键词 检索,按 q 退出。

使用 grep 提取关键行

当明确知道要找某段文字时,可以使用 grep 直接筛出包含该关键字的行:

crow@opsbox:~/work$ grep -n -F 'user010' /srv/ops/backups/2026-06/db-2026-06-30.sql
13:INSERT INTO users VALUES (4010, 'user010', 'member');

常用参数说明:

  • -n:显示匹配行在原文件中的行号,方便定位;
  • -F:按固定字符串匹配,不启用正则表达式,适合查找普通文本;
  • -i:忽略英文大小写。