08 - fd - 快速查找档案与目录

find 是个在查找档案的指令,但是它的预设行为并不是这麽的直观,需要使用特定的参数才能以一般搜寻的思维(例如:不分大小写,搜寻部分字串)执行,这使得 find 在使用上不这麽地方便,甚至因为需要记忆特定参数而容易遗忘,需要重新查找文件,带给使用者不便。

更人性化的查找指令 fd

fd 是个指令简单、快速且直观的查找指令,特色如下列所示:

  • 直观的语法:用 fd PATTERN 取代 find -iname '*PATTERN*'
  • 预设的 PATTERN 为正则表达式与 glob 。
  • 使用多工查找目录,因此搜寻速度快。
  • 使用颜色区隔不同的档案类型。
  • 同时执行多个指令。
  • 预设使用不分大小写的方式查找,如果 PATTERN 包含有大写,则使用区分大小写的方式搜寻。
  • 预设忽略隐藏档案。
  • 依照 .gitignore 的规则忽略档案。

安装 fd

使用 Homebrew 安装 fd

brew install fd

安装完成後,就可以使用 fd 来进行查找了。

使用 fd

直接使用 fd 指令,在没有任何参数的情况下会列出当前目录下所有的档案与目录:

fd

在後面加上参数 PATTERN

fd card

fd 会以不区分大小写,并忽略隐藏档案(包含 .gitignore )的方式对 PATTERN 进行查找。

https://ithelp.ithome.com.tw/upload/images/20210924/20107789eBssU3VYIP.png

fd 会以颜色区分不同类型的档案。

fd 有丰富的设定供使用者找到目标,可以使用 fd --help 观看详细的说明。接下来会介绍几个常用的操作。

正规表达式搜寻

fd 支援正规表达式:

> fd '^c.*d$'
gm-eb-proposal/frontend/vue-lbd-pro-html-v1.1.0/CHANGELOG.md
gm-eb-proposal/third-party/theme/light-bootstrap-dashboard-pro/CHANGELOG.md

fd 所使用的正规表达式语法可以参考 Docs.rs

搜寻特定目录

在第二个参数输入目录,搜索范围就会被限缩於此目录中。

fd card Documents/code

上例只会搜寻 Documents/code 中与 card 字串相符的档案。

搜寻特定副档名

使用 -e 可以搜寻拥有特定副档名的档案。

fd card -e vue

上例只会搜寻副档名为 vue 中与 card 字串相符的档案。

搜寻特定档名

fd 预设会搜寻目录与档案,而且只需要匹配部分字串即可,如果要只搜寻特定档案的话,可以使用 -g ( glob )参数。

fd -g card.vue

上例只会搜寻名为 card.vue 的档案。

搜寻忽略的档案

fd 预设不会查找隐藏档案,使用 -H (或 --hidden )来查找:

fd -H pre-commit

范例可以在原本隐藏的 .git 目录中查找 pre-commit

fd 预设会将 .gitignore 设定的目录及档案忽略,使用 -I (或 --no-ignore )来查找:

fd -I @vue

范例可以在原本被 .gitignore 忽略的 node_modules 中查找 @vue

使用查找到的档案执行指令

使用者查找档案通常的目的都是用这些档案去执行特定的指令做处理, fd 提供了执行指令的方式:

  • -x--exec :每个结果分别带入指令同步执行。
  • -X--exec-batch :所有的结果一起带入指令执行(只执行一次)。
> fd -g '*.js' -x yarn prettier --write
prettier --write config/storybook/main.js
prettier --write config/storybook/preview.js

上例会将每个搜索到的 .js 档案给予 yarn lint:prettier 作为参数执行。

如果将 -x 改为 -X ,会是所有的路径以空白分开带入指令:

> fd -g '*.js' -X yarn prettier --write
prettier --write config/storybook/main.js config/storybook/preview.js

使用 Placeholder 语法

fd 使用 Placeholder 语法让使用者决定要怎麽将结果带入指令中。

fd -g '*.js' -x yarn prettier --write {}

上例在指令的後面加上 {} ,表示要使用完整的结果作为参数,会跟没有设定时是一样的效果。

这里介绍各个 Placeholder 语法:

  • {} :完整的路径,此为预设。( config/storybook/main.js
  • {.} :剔除副档名。( config/storybook/main
  • {/} :只保留最後一层。( main.js
  • {//} :剔除最後一层。( config/storybook
  • {/.} :只保留最後一层并剔除副档名。( main

排除档案或目录

使用 -E (或 --exclude )排除档案或目录:

fd test -H -E .git

上例搜寻 test 要包含隐藏档案,但是要排除 .git 目录。

本文重点整理

  • find 指令用以搜索档案与目录,但其使用方式不直观,造成使用者需要花时间习惯与记忆。
  • fd 指令是 find 的优化版本,提供直观的使用方式,并且提供高效的搜寻体验。
  • 指令 fd 会列出当前目录所有的档案与目录。
  • 指令 fd PATTERN 会列出所有与 PATTERN 吻合的档案与目录。
  • 指令 fd PATTERN /foo/bar 只会搜寻 /foo/bar 下的档案与目录。
  • 指令 fd -e md 只会搜寻副档名为 md 的档案。
  • 指令 fd -H foo 会连同隐藏档案都搜寻。
  • 指令 fd -I foo 会连 .gitignore 忽略的档案都搜寻。
  • 指令 fd foo -x echo 会将搜寻结果一个个带给指令 echo 同步做处理。
  • 指令 fd foo -X echo 会将搜寻结果同时带给指令 echo 做处理。
  • fd -x 所设定的指令可以利用 Placeholder 语法决定要如何带入搜寻结果。
  • 指令 fd foo -E foo 会将 foo 目录或档案排除在结果外。

参考资料


<<:  安装与反安装--软件的彼得定律对系统的意义

>>:  EP12 - 重构并模组化 Terraform 程序码

【第二十天 - Graph 介绍】

Q1. Graph 是什麽 Graph 定义:一个 graph 由 数个点( vertex )与数个...

树选手1号:decision tree [python实例]

今天来用decision tree做一个预测肿瘤是恶性还是良性的应用,在这里就略过前期的资料处理与分...

Day21 NodeJS-Express VI

今天的内容是Express部份的最後一哩路:Restful API与应用程序结构化。前几天从前端到後...

让 GitHub Action 帮你天天登入 iThelp 赚取登入点数

前言 这是个人很久以前在闲暇之余写的一个专案,技术多为爬虫观念,後来整合 GitHub Action...

[前端暴龙机,Vue2.x 进化 Vue3 ] Day6. 模板语法

模板语法 在上一篇我们已经完成了我们第一个 Vue 建出来的 Hello Vue 网页,其中我们有学...