1

如何组合使用find exec命令

 1 year ago
source link: https://www.myfreax.com/how-to-combine-find-exec-commands/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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命令行中执行操作的无限可能。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK