使用 find -exec
和 xargs
对搜索结果执行操作
在本步骤中,你将超越简单的文件列表。你将学习如何直接对 find
命令找到的文件执行命令。这是一种执行批量操作的强大技术,例如更改权限、删除文件或运行自定义脚本。我们将介绍两种主要方法:find
的 -exec
选项和 xargs
命令。
我们将继续在上一实验步骤中的 ~/project/find_lab
目录中工作。首先,请确保你位于正确的目录。
cd ~/project/find_lab
使用 find -exec
-exec
选项允许你为 find
定位到的每个文件运行任意命令。其语法起初可能看起来有些不寻常:
find [path] [expression] -exec [command] {} \;
[command]
: 你要运行的命令(例如 ls -l
、rm
、chmod
)。
{}
: 这是一个特殊的占位符。find
会将 {}
替换为它找到的当前文件的完整路径。
\;
: 这是 -exec
命令必需的终止符。反斜杠 (\
) 是必需的,以防止 shell 将分号解释为特殊字符。
让我们来尝试一下。我们将查找所有扩展名为 .txt
的文件,并对每个文件运行 ls -l
来查看其详细信息。
find . -name "*.txt" -exec ls -l {} \;
输出显示了运行 ls -l
的结果,每个 .txt
文件都执行了一次:
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt
为了安全起见,find
提供了一个 -ok
选项,它的工作方式与 -exec
相同,但在执行命令之前会提示你进行确认。在执行删除文件 (rm
) 等破坏性操作时,强烈建议使用此选项。
让我们尝试删除之前创建的 .log
文件,但这次使用 -ok
来确保安全。
find . -name "*.log" -ok rm {} \;
对于找到的每个文件,find
都会询问你的确认。输入 y
并按 Enter 键批准删除。
< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y
确认后,你可以通过列出目录内容来验证文件是否已被删除。
ls -R
.:
File1.TXT file1.txt report.txt subdir
./subdir:
file3.txt
使用 xargs
-exec
的一种替代方法是将 find
的输出通过管道传递给 xargs
命令。xargs
从标准输入(由 find
提供的文件路径)读取项目,并使用这些项目作为参数执行指定的命令。
xargs
的主要优势在于效率。虽然 -exec ... \;
对每个文件都运行一次命令,但 xargs
会将文件路径分组,并以更少的命令执行次数(一次处理多个参数)来运行命令。
首先,让我们重新创建刚刚删除的日志文件,以便我们有东西可以操作。
touch file2.log subdir/another.log
现在,让我们使用 find
和 xargs
来列出我们 .log
文件的详细信息。
find . -name "*.log" | xargs ls -l
输出与 -exec
示例类似,但命令结构不同:
-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log
与 find -ok
类似,xargs
也使用 -p
选项提供“提示”模式。它会显示即将运行的命令,并询问你的确认。
让我们使用此选项再次删除 .log
文件。
find . -name "*.log" | xargs -p rm
xargs
会将文件分组到一个 rm
命令中,并询问你的确认。输入 y
并按 Enter 键。
rm ./file2.log ./subdir/another.log ?...y
你现在已经成功地使用了 -exec
和 xargs
来处理搜索结果,这是在 Linux 中自动化任务的一项基本技能。