Linux find命令是根据指定条件搜索文件和目录的绝佳工具。exec允许您对找到的文件执行指定操作。

例如你要使用find命令找到所有以.jpeg作为扩展名的文件,然后用.jpg扩展名重命名文件。

此时你两种方法可以对find命令的结果执行指定的操作。第一种是使用xargs命令,第二种是exec命令。

我们已经编写过有一篇xargs命令详解的文章。本教程将重点详解组合find exec命令的用法。

您不能只是通过管道将find命令输出重定向到另一个命令。它不会那么简单

在开始本教程之前,请运行touch命令touch file1.txt file2.txt file3.txt创建教程需要使用的文件。

touch file1.txt file2.txt file3.txt

find exec 命令实例教程

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

[command]是您要对find命令的结果执行的操作。{}是一个占位符,用于保存find命令的搜索结果。

\;表示[command]命令的结束。在这里你需要转义;避免shell的解释,因此会写成这样\;

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

+表示对于find命令搜索结果,运行一次[command]。所有结果都作为参数一起传递给[command]

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

find . -type f  -exec ls  {} ;命令将会对搜索每一个搜索结果运行ls命令,类似于运行3次ls命令,但每次参数都是不同的文件。

find . -type f  -exec ls  {} \;
#eq
ls file1.txt
ls file2.txt
ls file3.txt

如果你使用的是{} +。也就是将find命令的搜索结果一次传递给exec指定的命令[command]。例如命令find . -type f  -exec ls  {} ;

{} \;运行多次同一个命令相比,使用{} +是更好的选择,因为性能更好。但在某些情况你不能这样做。

如果find命令搜索结果有50个,则不能将搜索结果作为参数一次传递给命令,因为Linux对最大命令行长度有限制。

find . -type f  -exec ls  {} ;
#eq
ls file1.txt file2.txt file3.txt

find exec 命令搜索重命名文件扩展

使用find exec命令可让你以轻松重命名文件。在组合使用find exec命令还需要使用mv。mv 命令是用于移动文件或者重命名文件

以下命令将会修改当前目录的所有*.txt文件扩展名为.js-exec运行sh命令启动子shell进程。

sh -c 'mv "$1" "${1%.txt}.edefg"'子shell进程运行命令mv "$1" "${1%.txt}.js"${1%.txt}.js参数将会匹配原始文件扩展名的txt并替换为js

find . -type f -name '*.txt' -exec sh -c 'mv "$1" "${1%.txt}.js"' _ {} \;

find exec 命令删除文件

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

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

例如删除大于100 MB的文件,或者根据文件的修改时间删除文件。在这里,我们使用-mtime选项搜索过去10小时修改的文件并删除。

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

Find exec grep 命令搜索文件内容

find命令仅对文件属性进行搜索。而grep命令可用于文件的内容。将Find exec和grep组合起来,您就得到一个强大的命令行搜索工具。

例如命令find . -type f -name "*.js" -exec grep -H keyword {} ;搜索当前目录的所有js文件,然后使用grep命令搜索关键词keyword

这里之所以使用grep命令的-H选项,是因为grep默认不打印匹配搜索模式的文件名。-H选项将会打印匹配的文件名和匹配的内容并使用:分隔。

find . -type f -name "*.js" -exec grep -iH a {} \;

Find 命令与多个exec

是的,您可以将Find命令的搜索结果链接多个exec命令。多个exec命令并不是共享find命令的搜索结果。

而是第一个exec命令的结果再传递下一个exec命令。例如以下命令它将首先搜索.hbs文件。然后第一个exec命令的标准输出传递到第二个exec命令。

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

find . -type f -name "*js" -exec ls {} \; -exec grep -H keyword {} \; 

find exec 命令修改文件目录权限所有权

修改文件和目录的所有权是组合Find exec命令另一个例子。以下命令,搜索myfreax用户拥有的文件,然后将其所有权更改为myfreax.com

如果你学会更改文件的所有权,自然你很容易就会使用find exec命令修改文件目录权限,-type f是文件,-type d是目录。

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

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

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