fd -x/-X命令执行完全指南:批量解压、自动格式化等5个实用示例
2026/9/21 19:22:02 网站建设 项目流程

fd -x/-X命令执行完全指南:批量解压、自动格式化等5个实用示例

【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd

fd是一款简单、快速且用户友好的find替代工具,它的两大命令执行选项-x(--exec)-X(--exec-batch)可以让搜索不止"看结果",而是直接对每个搜索结果执行外部命令——批量解压、自动格式化代码、批量删除文件,一条命令全部搞定。这篇指南带你从零理解二者的区别,并掌握 5 个高频实用示例。

先搞懂:fd -x 与 -X 的核心区别

在执行任何示例之前,先花 30 秒理解这两个选项的本质差异,后面所有用法都建立在这之上:

选项别名行为执行次数
-x--exec每一个搜索结果各执行一次命令,且并行运行结果数 = 命令数
-X--exec-batch把所有搜索结果作为参数,一次性执行同一条命令固定 1 次

比如找到file1.zipbackup/file2.zip两个压缩包时:

  • fd -e zip -x unzip会并行执行unzip file1.zipunzip backup/file2.zip
  • fd -e zip -X unzip只会执行一条unzip file1.zip backup/file2.zip

💡 记忆口诀:小写-x逐个并行,大写-X打包一次。

源码中这两种模式对应ExecutionMode::OneByOneExecutionMode::Batch,实现位于 src/exec/mod.rs;命令行参数的解析则见 src/cli.rs。

占位符速查表

-x/-X接收的不是一个字符串,而是一个"命令模板"。模板中可以使用这些占位符(如果你的命令里没有写占位符,fd 会自动在末尾补上{}):

占位符含义示例(结果documents/images/party.jpg
{}完整路径documents/images/party.jpg
{.}去掉扩展名的路径documents/images/party
{/}文件名(basename)party.jpg
{//}父目录路径documents/images
{/.}文件名(去扩展名)party

⚠️ 两个高频细节:

  1. 参数归属-x之后的所有位置参数都属于命令模板,而不属于 fd 本身。如果想再传搜索模式或路径,就把-x放在最后:fd pattern path -x echo
  2. 提前终止模板:如果想在命令模板之后继续写 fd 的选项,用\;结束模板,例如fd -x echo \; pattern path

示例一:一键批量解压所有 zip 压缩包 📦

递归找到当前目录下所有 zip 文件并逐一解压,每个解压任务并行执行:

fd -e zip -x unzip

假设存在file1.zipbackup/file2.zip,fd 会并行运行unzip file1.zipunzip backup/file2.zip,比手动逐个解压快得多。

示例二:自动格式化全部 C++ 源码 ✨

找到所有.h.cpp文件,用clang-format原地自动格式化:

fd -e h -e cpp -x clang-format -i

注意-iclang-format的参数,它紧跟在命令模板之后——这正是"命令模板是一串参数"这一设计的价值:任何外部命令的选项都能自然接上。

示例三:一次性在 vim 中打开所有测试文件 📝

找到所有test_*.py文件,用单个vim 实例同时打开:

fd -g 'test_*.py' -X vim

这里特意使用大写的-X:如果存在test_basic.pylib/test_advanced.py,实际执行的是vim test_basic.py lib/test_advanced.py,而不是弹出两个互相打架的 vim 窗口。

顺带一提,把结果丢给其他工具批量处理也是-X的拿手好戏,例如在全部 C++ 源文件中搜索特定代码:

fd -e cpp -e cxx -e h -e hpp -X rg 'std::cout'

示例四:批量删除匹配文件的安全姿势 🧹

-X配合rm是清理垃圾文件的利器,例如递归删除所有.DS_Store

fd -H '^\.DS_Store$' -tf -X rm

🛡️安全守则:不确定时会删掉什么?先去掉-X rm跑一遍,用 fd 本身列出命中清单确认无误,再执行删除。也可以加上rm的交互模式逐个确认:

fd -H '^\.DS_Store$' -tf -X rm -i

若还要删除整个目录,记得给rm加上-r递归参数。

示例五:并行计算全部文件的 MD5 校验和 🔍

-x的并行执行还有一个隐藏优势:多线程输出的终端内容不会互相串行或乱码。因此可以用它简单地把"同一任务跑遍大量文件"并行化,比如为目录里每个文件生成校验和:

fd -tf -x md5sum > file_checksums.txt

想控制并行度,用-j/--threads参数;设为--threads=1即为串行执行。

常见疑问与最佳实践

Q:什么时候必须用-X,什么时候必须用-xA:需要"每个文件独立处理"(解压、格式化、转码)用-x;需要"一个程序一次性接收所有文件"(编辑器、rgrm)用-X

Q:命令模板里的{}一定要写吗?A:不用。不写占位符时,fd 会自动在模板末尾追加{},这也是fd -e zip -x unzip能直接工作的原因。

Q:fd 默认会搜索隐藏文件和.git吗?A:不会。默认忽略隐藏目录/文件并遵守.gitignorefd还额外支持.fdignore)。需要时加-H搜索隐藏文件、-I忽略 ignore 规则,或用-E '*.bak'显式排除某类文件。

延伸学习

  • 完整功能说明与更多示例:README.md
  • 命令执行模式的源码实现:src/exec/(含 src/exec/command.rs 与 src/exec/job.rs)
  • 所有命令行选项速查:fd -h(简版)或fd --help(详细版),文档源码见 doc/fd.1

掌握-x-X之后,fd 就从"找文件的工具"升级成了"批量处理文件的瑞士军刀"——去试试用一条命令完成你上次重复了十次的手工操作吧 🚀

【免费下载链接】fdA simple, fast and user-friendly alternative to 'find'项目地址: https://gitcode.com/GitHub_Trending/fd/fd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询