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

4.5 KiB
Raw Permalink Blame History

在 Linux 中使用 Find 命令

原文:https://python.land/the-unix-shell/using-the-find-command

有一个强大的 Linux 命令,如果用在正确的地方,可以帮你省去很多麻烦。叫find。它从提供的路径开始遍历文件树。接下来,它打印每个目录和文件,包括其相对于当前工作目录的路径。让我们一起来探索一下 Linux 中的 find 命令吧!

目录

基础知识

尝试一下,输入以下内容,看看会得到什么样的输出:

$ find .

对我来说,输出是这样的:

.
./images
./images/cover.jpg
./scripts
./scripts/loop.sh
./scripts/arguments.sh
./scripts/words.txt

第一个点就是当前目录。Find将同时输出目录文件。如果您只想列出文件,请使用:

$ find . -type f

如果您只想列出目录,请使用:

find . -type d

表情

基本的到此为止。Linux 中的 find 命令也接受表达式,这进一步缩小了它应该返回的文件的范围。我经常使用的一个有用的表达是-mtime。以下命令返回 5 分钟前修改的所有文件:

$ 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. 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 脚本中的 for 循环,并用它们做一些很棒的事情,对吗?

没错但是由于很明显您想要对返回的文件执行一些操作find 已经覆盖了我们。不需要编写脚本。

假设您想要删除符合您的标准的文件,您可以简单地将-delete添加到您的find-命令中。这显然有点危险,所以在使用这个标志之前,总是先检查没有这个标志的find命令的输出。

给我们更多灵活性的是-exec标志。它允许我们执行任何命令。你以前可能见过这样一个例子:

$ find /path/to/files* -mtime +5m -exec rm {} +

让我们来分解一下:

  • 查找给定路径中 5 分钟前修改过的所有文件
  • 执行rm命令(删除文件)
  • 对于给定实用程序的每次调用,{} +被替换为尽可能多的路径名(在我们的例子中是ls)

这实际上是一种非常有效的删除大量文件的方法,比如数千甚至数百万个文件。

该命令的一个简单替代方法是:

$ find /path/to/files* -mtime +5m -exec rm {} \;

不同之处在于,现在对每个文件都执行rm,而不是系统允许的每批文件数。您使用哪个版本取决于您对结果执行的命令。如果你能用带加号的那个,那就快多了!这是因为该命令同时在许多文件上执行,节省了操作系统打开、启动、运行和退出程序所需的大量 CPU 周期。然而,有些命令一次只接受一个文件,对于这些命令,第二个版本可以解决问题。

同样:如果你输入man find(或者访问在线手册页,你会得到完整的文档。但是我承认。我也倾向于在谷歌上搜索这些东西,因为你通常会得到有用的例子,而不需要费力地阅读原始文档。然而,在按回车键之前,一定要试着理解你粘贴到终端上的到底是什么!