geekdoc-python-zh/docs/pythonland/65.md

107 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

2024-03-03 22:54:39 +08:00
# 在 Linux 中使用 Find 命令
> 原文:[https://python.land/the-unix-shell/using-the-find-command](https://python.land/the-unix-shell/using-the-find-command)
有一个强大的 [Linux 命令](https://python.land/the-unix-shell/basic-linux-commands),如果用在正确的地方,可以帮你省去很多麻烦。叫`find`。它从提供的路径开始遍历文件树。接下来,它打印每个目录和文件,包括其相对于当前工作目录的路径。让我们一起来探索一下 Linux 中的 find 命令吧!
目录
* [基础知识](#The_basics "The basics")
* [表情](#Expressions "Expressions")
* [动作:使用结果](#Actions_using_the_results "Actions: using the results")
## 基础知识
尝试一下,输入以下内容,看看会得到什么样的输出:
```py
$ find .
```
对我来说,输出是这样的:
```py
.
./images
./images/cover.jpg
./scripts
./scripts/loop.sh
./scripts/arguments.sh
./scripts/words.txt
```
第一个点就是当前目录。`Find`将同时输出目录*和*文件。如果您只想列出文件,请使用:
```py
$ find . -type f
```
如果您只想列出目录,请使用:
```py
find . -type d
```
## 表情
基本的到此为止。Linux 中的 find 命令也接受表达式,这进一步缩小了它应该返回的文件的范围。我经常使用的一个有用的表达是`-mtime`。以下命令返回 5 分钟前修改的所有文件:
```py
$ find . -type f -mtime +5m
```
m 是一个修饰符,下表列出了所有可用的修饰符:
| 修饰语 | 意义 |
| --- | --- |
| s | 第二 |
| m | 分钟(60 秒) |
| h | 小时(60 分钟) |
| d | 日(24 小时) |
| w | 周(7 天) |
Thank you for reading my tutorials. I write these in my free time, and it requires a lot of time and effort. I use ads to keep writing these *free* articles, I hope you understand! **Support me by disabling your adblocker on my website** or, alternatively, **[buy me some coffee](https://www.buymeacoffee.com/pythonland)**. It's much appreciated and allows me to keep working on this site!
加号也很重要:
* 前面的加号表示“大于 n”
* 前面的减号表示“小于 n”
* 两者都不意味着“正好是 n”
另一个有用的表达式是`-name`,它将根据文件名过滤结果。对于名称,您可以使用 shell 模式。所以命令`find . -name "*.txt"`只会返回扩展名为`.txt`的文件。
## 动作:使用结果
有了我们新的 ninja 脚本能力,我们现在可以使用 Linux `find`命令返回一堆文件,将它们送入 [Bash 脚本](https://python.land/the-unix-shell/creating-bash-scripts)中的 for 循环,并用它们做一些很棒的事情,对吗?
没错但是由于很明显您想要对返回的文件执行一些操作find 已经覆盖了我们。不需要编写脚本。
假设您想要删除符合您的标准的文件,您可以简单地将`-delete`添加到您的`find`-命令中。这显然有点危险,所以在使用这个标志之前,总是先检查没有这个标志的`find`命令的输出。
给我们更多灵活性的是`-exec`标志。它允许我们执行任何命令。你以前可能见过这样一个例子:
```py
$ find /path/to/files* -mtime +5m -exec rm {} +
```
让我们来分解一下:
* 查找给定路径中 5 分钟前修改过的所有文件
* 执行`rm`命令(删除文件)
* 对于给定实用程序的每次调用,`{} +`被替换为尽可能多的路径名(在我们的例子中是`ls`)
这实际上是一种非常有效的删除大量文件的方法,比如数千甚至数百万个文件。
该命令的一个简单替代方法是:
```py
$ find /path/to/files* -mtime +5m -exec rm {} \;
```
不同之处在于,现在对每个文件都执行`rm`,而不是系统允许的每批文件数。您使用哪个版本取决于您对结果执行的命令。如果你能用带加号的那个,那就快多了!这是因为该命令同时在许多文件上执行,节省了操作系统打开、启动、运行和退出程序所需的大量 CPU 周期。然而,有些命令一次只接受一个文件,对于这些命令,第二个版本可以解决问题。
同样:如果你输入`man find`(或者访问[在线手册页](https://man7.org/linux/man-pages/man1/find.1.html),你会得到完整的文档。但是我承认。我也倾向于在谷歌上搜索这些东西,因为你通常会得到有用的例子,而不需要费力地阅读原始文档。然而,在按回车键之前,一定要试着理解你粘贴到终端上的到底是什么!