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 {} \;