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.zip和backup/file2.zip两个压缩包时:
fd -e zip -x unzip会并行执行unzip file1.zip和unzip backup/file2.zip;fd -e zip -X unzip只会执行一条unzip file1.zip backup/file2.zip。
💡 记忆口诀:小写-x逐个并行,大写-X打包一次。
源码中这两种模式对应ExecutionMode::OneByOne与ExecutionMode::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 |
⚠️ 两个高频细节:
- 参数归属:
-x之后的所有位置参数都属于命令模板,而不属于 fd 本身。如果想再传搜索模式或路径,就把-x放在最后:fd pattern path -x echo。 - 提前终止模板:如果想在命令模板之后继续写 fd 的选项,用
\;结束模板,例如fd -x echo \; pattern path。
示例一:一键批量解压所有 zip 压缩包 📦
递归找到当前目录下所有 zip 文件并逐一解压,每个解压任务并行执行:
fd -e zip -x unzip假设存在file1.zip和backup/file2.zip,fd 会并行运行unzip file1.zip与unzip backup/file2.zip,比手动逐个解压快得多。
示例二:自动格式化全部 C++ 源码 ✨
找到所有.h和.cpp文件,用clang-format原地自动格式化:
fd -e h -e cpp -x clang-format -i注意-i是clang-format的参数,它紧跟在命令模板之后——这正是"命令模板是一串参数"这一设计的价值:任何外部命令的选项都能自然接上。
示例三:一次性在 vim 中打开所有测试文件 📝
找到所有test_*.py文件,用单个vim 实例同时打开:
fd -g 'test_*.py' -X vim这里特意使用大写的-X:如果存在test_basic.py和lib/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,什么时候必须用-x?A:需要"每个文件独立处理"(解压、格式化、转码)用-x;需要"一个程序一次性接收所有文件"(编辑器、rg、rm)用-X。
Q:命令模板里的{}一定要写吗?A:不用。不写占位符时,fd 会自动在模板末尾追加{},这也是fd -e zip -x unzip能直接工作的原因。
Q:fd 默认会搜索隐藏文件和.git吗?A:不会。默认忽略隐藏目录/文件并遵守.gitignore(fd还额外支持.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),仅供参考