myfreax

如何组合使用find exec命令

Linux的find命令是根据指定条件查找文件和目录的绝佳工具。您可以通过对找到的文件执行特定操作来将您的find命令提升到一个新的水平

5 min read
By myfreax
如何组合使用find exec命令
linux-find-exec

Linux的find命令是根据指定条件查找文件和目录的绝佳工具。您可以通过对找到的文件执行特定操作来将您的find命令提升到一个新的水平。

例如,您找到了所有扩展名为.jpeg的文件。用.jpg扩展名重命名它们。您不能只是通过管道将find命令输出重定向到另一个命令。它不会那么简单。

您有两种方法可以对find命令的结果执行其他命令,使用xargs或者exec。已经有一篇关于xargs命令的详解的文章。本教程将重点介绍结合find和exec命令。

exec与find命令的输出

find命令和exec命令组合使用的基本语法是find [path] [arguments] -exec [command] {} ;

[command]是您要对find命令的结果执行的命令。{}是一个占位符,用于保存find命令的输出结果。\;表示命令的结束。在这里你需要转义;,因此会写成这样\;

还有另一种语法与上述略有不同,这是它的语法形式find [path] [arguments] -exec [command] {} +

在这里,+表示对于find命令的每个结果,只执行一次[command]。所有结果都作为参数一起传递给[command]+在这里有它意义,因此不需要用转义它\+.

如果你仍然对{} \;和的使用感到困惑{} +,你可以尝试跟着我们的示例进行操作。

如果你需要每个找到的结果执行命令则使用{} \;。比如下面是一使用find命令和ls命令以及{} \;组合使用运行方式。

ls file1.txt
ls file2.txt
ls file3.txt

如果你使用的是{} +。它运行方式是下面这样的,也就是使用所有结果参数运行一次命令。

ls file1.txt file2.txt file3.txt

虽然在这里使用{} +是更好的选择,性能更好。但事实恰恰相反。如果find命令有50个结果,则不能将它们全部作为参数一起传递,因为Linux对最大命令行长度有限制。

让我理解一些find与exec命令的常见示例,以便您更好地理解它们。在find exec命令的第一个简单示例中,我将显示/tmp目录下的所有lock文件并显示它们的属性。

sudo find /tmp/ -type f -name *lock -exec ls -l {} \;

find查找并重命名文件

是的,使用find和exec可以轻松重命名文件。mv 命令用于重命名文件。你也可以这样做。

命令查找以名称ubuntu开头的文件并将它们存储在占位符中{}。一旦将结果存储在占位符中,它将在占位符中每个文件末尾添加_renamed。

sudo find /home/myfreax/Downloads/ -type f -name 'ubuntu*' -exec mv {} {}_renamed \;

find exec删除文件

自动删除文件时请格外小心。如果不注意,可能会是灾难性的。要么使用交互式删除,rm -i要么先查看find命令的结果。

find exec命令组合的另一个常见示例是查找大于指定大小的文件并将其删除。如果您正在清理日志,这很有效。

我删除大于100 MB的文件。同样,您也可以根据文件的修改时间删除文件。例如,删除超过10天的文件。

在这里,我使用了-mtime来识别过去24小时内修改的数据,当与它配对+10,它会查找并删除超过10天的文件。

find ~/Desktop -size +100M -exec rm {} \;
sudo find /tmp/ -type f -mtime +10 -exec rm {} \;

更改文件和目录的所有权

更改文件和目录的所有权是find exec组合功能强大的另一个例子。在这里,查找由名为的myfreax用户拥有的文件,然后将其所有权更改为myfreax.com

如果你学会更改文件的所有权,自然你很容易就会使用find exec更改文件的权限,这里使用-type f,所以命令只会应用于指定目录下的文件。

sudo find /home/myfreax/disk/Downloads -user sagar -type f -exec chown myfreax.com {} \;

sudo find /home/myfreax/disk/Downloads -type f -exec chmod 644 {} \;

find exec grep命令

find命令对文件名起作用。grep命令作用于文件的内容。将find和grep exec结合起来,您就得到了一个强大的Linux命令行搜索工具。

例如,下面的命令搜索所有.hbs扩展名的文件。使用grep,它会在这些 .hbs文件的内容中搜索字符串excerpt

这里的grep命令使用-H选项,将显示每个匹配项的文件名。

find . -type f -name "*.hbs" -exec grep -iH excerpt {} \;

find与多个exec

find . -type f -name "*.hbs" -exec echo {} \; -exec grep excerpt {} \;

是的,您可以使用单个find命令链接多个exec命令。让我以您在上一节中看到的相同示例并使用两个exec命令。

它将首先搜索.hbs文件,然后使用第一个exec命令echo它们的名称。然后,将在这些文件中搜索excerpt字符串。

Find是很强大的命令,用于根据多个条件搜索文件。exec命令使您能够处理find命令的结果。

我在这里分享的例子只是简单的示例。find exec命令组合一起为您提供了在Linux命令行中执行操作的无限可能。

Related Articles