fd - 更好的 find 命令
欢迎关注我的公众号 spider-learn
fd
(https://github.com/sharkdp/fd) 是 find
命令的一个更现代的替换。
对比一下
查找名字含有某个字符的文件
OLD
-> % find . -name "*hello*" ./courses/hello_world.go ./courses/chapter_01/hello_world.go ./courses/chapter_01/hello_world ./examples/01_hello_world.go
NEW
-> % fd hello courses/chapter_01/hello_world courses/chapter_01/hello_world.go courses/hello_world.go examples/01_hello_world.go
使用正则表达式查找
比如说查找符合 \d{2}_ti
模式的文件。find
使用的正则表达式非常古老,比如说在这里我们不能使用 \d
,也不能使用 {x}
这种语法。因此我们需要对我们的正则表达式做一些改写。关于find
支持的正则表达式这里就不展开了。
fd
默认就是使用的正则表达式作为模式,并且默认匹配的是文件名;而 find
默认匹配的是完整路径。
OLD
-> % find . -regex ".*[0-9][0-9]_ti.*" ./examples/33_tickers.go ./examples/48_time.go ./examples/28_timeouts.go ./examples/50_time_format.go ./examples/32_timers.go
NEW
-> % fd '\d{2}_ti' examples/28_timeouts.go examples/32_timers.go examples/33_tickers.go examples/48_time.go examples/50_time_format.go
指定目录
find
的语法是 find DIRECTORY OPTIONS
;而 fd
的语法是 fd PATTERN [DIRECTORY]
。注意其中目录是可选的。这点个人认为非常好,因为大多数情况下,我们是在当前目录查找,每次都要写 .
非常烦。
OLD
-> % find examples -name "*hello*" examples/01_hello_world.go
NEW
-> % fd hello examples examples/01_hello_world.go
直接执行命令
find 会打印帮助信息,而 fd 则会显示当前目录的所有文件。
OLD
-> % find usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
NEW
-> % fd courses courses/chapter_01 courses/chapter_01/chapter_1.md courses/chapter_01/chapter_1.pdf courses/chapter_01/hello_world courses/chapter_01/hello_world.go
按后缀名查找文件
这是一个很常见的需求,find
中需要使用 -name "*.xxx"
来过滤,而 fd
直接提供了 -e
选项。
OLD
-> % find . -name "*.md" ./courses/chapter_01/chapter_1.md ./courses/chapter_1.md
NEW
-> % fd -e md courses/chapter_01/chapter_1.md courses/chapter_1.md
查找中过滤掉 .gitignore
中的文件
find
并没有提供对 .gitingnore
文件的原生支持,更好的方法可能是使用 git ls-files
。而作为一个现代工具,fd
则默认情况下就会过滤 gitignore
文件,更多情况请查阅文档。
可以使用 -I
来包含这些文件,使用 -H
添加隐藏文件。
OLD
-> % git ls-files | grep xxx
NEW
-> % fd xxx
排除某个文件夹
OLD
-> % find . -path ./examples -prune -o -name '*.go' ./courses/hello_world.go ./courses/chapter_01/hello_world.go ./examples
NEW
-> % fd -E examples '.go$' courses/chapter_01/hello_world.go courses/hello_world.go
使用 xargs
一般来说,如果使用管道过滤的话,需要使用 '\0' 来作为字符串结尾,避免一些潜在的空格引起的问题。
在 find
中需要使用 -print0
来调整输出 '\0' 结尾的字符串,在 xargs
中需要使用 -0
表示接收这种字符串。而在 fd
中,和 xargs
保持了一直,使用 -0
参数就可以了。
OLD
-> % find . -name "*.go" -print0 | xargs -0 wc -l 7 ./courses/hello_world.go 7 ./courses/chapter_01/hello_world.go 50 ./examples/07_switch.go ...
NEW
-> % fd -0 -e go | xargs -0 wc -l 7 courses/chapter_01/hello_world.go 7 courses/hello_world.go 7 examples/01_hello_world.go ...
总之,fd 命令相对于 find 来说相当简单易用了
PS
使用 exec Using exec
OLD
-> % find . -name "*.md" -exec wc -l {} \; 114 ./courses/chapter_01/chapter_1.md 114 ./courses/chapter_1.md
NEW
You could also omit the {}
-> % fd -e md --exec wc -l {} 114 courses/chapter_1.md 114 courses/chapter_01/chapter_1.md
欢迎关注我的公众号 spider-learn
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?