别再用 find 了:一行 fd 命令背后的三个人生道理

副标题:关于隐藏文件的”洁癖”、实习生与老油条的爱恨情仇、以及为什么你的终端应该学会”边选边看”


引子:一个找不到的 .zshrc

事情是这样的。你想在项目文件夹里翻出所有跟 zshrc 有关的文件,顺手敲了一行命令:

fd zshrc ~/ws/todd/effectiveCodingBase/

然后,什么都没有

你开始怀疑人生:路径是不是写错了?文件是不是被我自己手滑删了?要不要打开 Neo-tree 手动翻一遍?

打住。不是你的问题,是 fd 的”洁癖”。


第一课:隐藏文件不是”消失”了,是 fd 假装没看见

.zshrc 前面那个点,在 Unix 世界里是”隐藏文件”的暗号。而 fd 这个工具有个近乎强迫症的默认设定:默认不显示隐藏文件,理由大概是”怕你被一堆 .git.cache.DS_Store 淹没”。

这份好意换来的代价就是:你认认真真敲的命令,结果啥也搜不到,连个警告都没有。

解法就一个字母:

fd -H zshrc ~/ws/todd/effectiveCodingBase/

-H = --hidden,翻译过来就是:”我知道有风险,我自愿看隐藏文件”。

人生道理 #1:很多工具的”默认行为”不是 bug,是一种”善意的过滤”。但善意用错场合就是绊脚石。搞清楚一个工具”默认藏起了什么”,往往比学会它的”高级参数”更重要——因为高级参数是加分项,而默认行为的坑是送命题。


第二课:fdfind 的区别,像极了老油条和实习生

写了十几年脚本的人都用过 find。它靠谱,但靠谱得有点笨:

维度 find(实习生型) fd(老油条型)
.gitignore 视而不见,node_modules 照样全翻 默认自动跳过
隐藏文件 全部翻出来,不管你要不要 默认不翻,你说了算(-H)
语法 find . -iname "*.txt" fd txt
速度 单线程,老实巴交 并行处理,通常快一个身位
输出 黑白,朴素 彩色,一眼分清文件/目录

find 是那种”你没明确说不让我看的地方,我全给你翻一遍”的实习生——认真但费电,还容易把 node_modules 里几万个文件都搜一遍,搜出一屏幕垃圾。

fd 是那种”默认帮你避开该避开的坑,你要真想看隐藏文件,说一声就行”的老油条——效率高,但你得懂它的”潜规则”。

人生道理 #2:工具越”聪明”,你越需要理解它的假设前提。find 什么假设都没有,所以最笨也最”诚实”;fd 帮你做了一堆合理假设,所以更好用,但也更需要你知道”它在替你做什么决定”。


第三课:找到只是开始,批量处理才是终局

找到文件只解决了”看见”的问题,真正的效率提升在于找到之后立刻处理。这里祭出 -x-X:

# -x:每个结果单独执行一次(类似 xargs -I{})
fd -H zshrc ~/ws/todd/effectiveCodingBase/ -x diff {} ~/.zshrc

# -X:所有结果一次性打包给一个命令
fd -H zshrc ~/ws/todd/effectiveCodingBase/ -X code

打个比方:

而且 fd 内置的转义处理帮你避开了一个经典地雷:文件名带空格。用过原生 xargs 的都懂,忘了加 -0 分隔符,分分钟把 my zshrc backup.txt 拆成两个参数,报错报到怀疑人生。fd -x/-X 直接帮你把这坑填了。


终极形态:fd + fzf + nvim,一条流水线走到底

如果说前面都是”找到文件”,这一段才是真正的”工作流”——找、看、选、开,一气呵成:

fd -H -t f zshrc ~/ws/todd/effectiveCodingBase/ \
  | fzf --preview 'bat --color=always {}' \
  | xargs -r nvim

拆解这条流水线:

  1. fd -H -t f —— 只要文件(-t f),隐藏的也不放过
  2. | fzf --preview 'bat ...' —— 交给 fzf,一边上下选,一边右边预览内容
  3. | xargs -r nvim —— 选中的直接用 nvim 打开,-r 保证空选择时不会误开一个空白 nvim

如果你已经在用 fzf 玩转 kubectx/kubens 选集群、选 namespace,这套”搜索 → 预览 → 选择 → 执行”的思路其实是同一个心智模型,只是把对象从 K8s 资源换成了文件而已。

彩蛋——多选模式:加个 -m,可以同时选中多个文件,一起丢给 nvim 开多个 buffer 对比:

fd -H -t f zshrc ~/ws/todd/effectiveCodingBase/ \
  | fzf -m --preview 'bat --color=always {}' \
  | xargs -r nvim

Tab 多选,Enter 确认,一步到位。


收尾:这条命令教会我们的,其实不只是命令

一行 fd -H zshrc ... 表面上是在找一个配置文件,但往深了看,它其实在提醒我们三件事:

  1. 默认行为都是有立场的——工具的”聪明”往往意味着它替你做了决定,搞清楚这个决定是什么,比记住参数更重要。
  2. 好工具不是功能多,是假设合理——fdfind 好用,不是因为参数更多,而是因为它对”你大概率想要什么”的猜测更贴近真实开发场景。
  3. 命令行的终极形态是流水线,不是单点命令——找到只是第一步,fd + fzf + nvim 这种”搜索即操作”的组合拳,才是真正省下的那些”看似不起眼但天天在发生”的时间。

下次再遇到某个命令”什么都搜不到”的时候,先别怀疑自己,问一句:它是不是替我藏了点什么?