Post

【学习笔记】Linux 基本命令

在日常工作中遇到的Linux常用基本命令的笔记。

【学习笔记】Linux 基本命令

Linux常用文件操作命令

find命令

man find 的文档非常冗长且包含大量生僻用法,对于 99% 的日常工作和开发场景,只需要掌握以下几个核心维度

我们可以把 find 的逻辑简化为一个公式:

find [在哪里找] [找什么] [找到后做什么]

以下是提炼出的绝对重点,按使用频率排序:


1. 基础查找:按名称 (Name)

这是最常用的功能。

  • 基本用法: ```bash find . -name “config.yaml”
1
2
3
4
5
6
7

*解释:在当前目录 (`.`) 及其子目录下找名为 `config.yaml` 的文件。*
* **模糊匹配 (通配符):**
```bash
find /var/log -name "*.log"

解释:在 /var/log 下找所有后缀为 .log 的文件。注意:通配符最好用引号包起来,防止 Shell 提前展开。

  • 忽略大小写: 使用 -iname (i = ignore case)。 ```bash find . -iname “readme.md”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


#### 2. 过滤杂讯:按类型 (Type)

Linux 下一切皆文件,但你通常只想找“文件”或“目录”。

* **只找文件:** `-type f` (file)
* **只找目录:** `-type d` (directory)

**组合示例:**

```bash
# 只找名为 build 的目录(不找名为 build 的文件)
find . -type d -name "build"

3. 清理磁盘:按大小 (Size)

用于寻找大文件或空文件。

  • 语法: -size [+/-]大小[单位]
  • + 表示大于,- 表示小于。
  • 常用单位:k (KB), M (MB), G (GB)。

示例:

1
2
3
4
5
6
# 查找大于 100MB 的文件
find . -type f -size +100M

# 查找空文件(大小为0)
find . -empty

4. 追溯历史:按时间 (Time)

这是 man 文档中最难懂的部分,记住 -mtime (修改时间) 就够用了。

  • 语法: -mtime [+/-]天数
  • -n:n 天以内(最近 n 天)。
  • +n:n 天以前(超过 n 天)。

示例:

1
2
3
4
5
6
# 查找最近 7 天内修改过的文件 (用于排查最近改坏了什么)
find . -mtime -7

# 查找 30 天前修改过的旧日志 (用于清理)
find /var/log -name "*.log" -mtime +30

注: 如果需要按“分钟”算,使用 -mmin


5. 进阶大招:执行操作 (Exec)

默认情况下,find 只是把找到的文件打印出来 (-print)。如果你想对找到的文件进行操作(比如删除、移动、重命名),有两个方法:

A. 危险但快捷:-delete

直接删除找到的文件。一定要先不加 -delete 运行一次,确认没找错文件!

1
2
3
# 删除所有 .tmp 文件
find . -name "*.tmp" -delete

B. 万能操作:-exec

这是 find 最强大的地方,可以配合任何 Linux 命令。

  • 标准格式: -exec 命令 {} \;
  • {} 代表找到的文件名占位符。
  • \; 代表命令结束(反斜杠是必须的,防止分号被 Shell 吞掉)。

经典示例:

1
2
3
4
5
6
# 找到所有 .py 文件,并修改它们的权限为 644
find . -name "*.py" -exec chmod 644 {} \;

# 找到所有 log 文件,并用 grep 搜索里面的 "Error" 关键字
find . -name "*.log" -exec grep "Error" {} \;


6. 性能优化:限制深度 (Maxdepth)

如果你的目录结构非常深(比如 node_modules),全盘扫描会很慢。

  • -maxdepth 1:只查当前目录,不进子目录。
  • -maxdepth 2:只查两层。
1
2
3
# 只在当前层级找文件,不递归
find . -maxdepth 1 -name "*.txt"


总结:高频速查表

场景参数/命令示例
找名字-name / -inamefind . -name "*.jpg"
找类型-type f / -type dfind . -type d -name "src"
找大小-size +1Gfind . -size +100M
找时间-mtime +7 / -mtime -1find . -mtime -1 (最近24h)
做操作-exec ... {} \;find . -name "*.sh" -exec chmod +x {} \;
只删文件-deletefind . -name "temp" -delete
逻辑非!-notfind . ! -name "*.c" (找不是.c的文件)

建议: 虽然 find 很强大,但在文件特别多(数百万级)时,它会很慢。如果你只是想快速找个文件在哪,用 locate 命令(基于索引)通常会快得多。

locate命令

locate 就像是 Windows 下的 “Everything” 搜索工具,或者 macOS 的 Spotlight。

它的核心优势只有一个:。 但它有一个致命弱点:不实时

以下是 locate 的使用重点:

1. 核心逻辑:查数据库

find 是直接去硬盘上一个目录一个目录地“翻箱倒柜”,所以慢。 locate 是查一个预先建好的“清单”(数据库 /var/lib/mlocate/mlocate.db),所以极快。

基本用法:

1
2
locate config.yaml

解释:全盘秒搜所有名字里包含 config.yaml 的路径。


2. 必知必会:手动更新数据库

这是新手最容易掉的坑。 如果你刚新建了一个文件 new_file.txt,马上运行 locate new_file.txt,你会发现找不到。因为“清单”还没更新。

Linux 系统通常每天自动更新一次数据库。如果你想找最新文件,必须先运行:

1
2
sudo updatedb

注:运行后稍等几秒,待数据库更新完毕后再 locate 就能找到了。


3. 常用参数 (Top 3)

locate 的参数不多,记住这三个足够应对 90% 的场景:

  • 忽略大小写 (-i): ```bash locate -i readme.md
1
2
3
4
5
6
7
8

*能找到 `README.MD`, `ReadMe.md` 等。*
* **限制输出数量 (`-n`):**
有时候结果成千上万,你只想看前几个确认一下路径格式。
```bash
locate -n 5 "*.jpg"

只显示前 5 个结果。

  • 使用正则表达式 (-r): 当你需要精确匹配复杂模式时。 ```bash

    查找以 .conf 结尾的文件(注意:默认 locate 是模糊匹配,只要路径里包含 .conf 就算)

    locate -r “.conf$”

```


4. locate vs find:怎么选?

特性locatefind
速度极快 (毫秒级) (取决于硬盘大小和文件数)
实时性 (新建文件找不到,删掉的文件还能搜到) (直接读硬盘,所见即所得)
查找范围全盘搜索可以指定某个特定目录
功能仅限按名字搜索按名、大小、时间、权限…还能执行操作
适用场景“我不记得文件在哪了,只想快速找出来”“我要精确找某个目录下最近修改过的文件”

5. 如果提示 command not found

很多精简版的 Linux 发行版(如 CentOS Minimal 或某些 Docker 容器)默认不预装 locate

  • Debian/Ubuntu: sudo apt install mlocate
  • CentOS/RHEL: sudo yum install mlocate (安装完后记得第一次先运行 sudo updatedb)

1

This post is licensed under CC BY 4.0 by the author.