sharkdp/fd
GitHub: sharkdp/fd
fd 是一个用 Rust 编写的高性能文件搜索工具,是 Unix find 命令的现代替代品,专注于速度和易用性。
Stars: 41966 | Forks: 989
# fd
[](https://github.com/sharkdp/fd/actions/workflows/CICD.yml)
[](https://crates.io/crates/fd-find)
[[中文](https://github.com/cha0ran/fd-zh)]
[[한국어](https://github.com/spearkkk/fd-kor)]
`fd` 是一个用于在文件系统中查找条目的程序。
它是 [`find`](https://www.gnu.org/software/findutils/) 的一个简单、快速且用户友好的替代品。
虽然它并不旨在支持 `find` 的所有强大功能,但它为绝大多数用例提供了合理(有主见)的默认设置。
[安装](#installation) • [使用方法](#how-to-use) • [故障排除](#troubleshooting)
## 功能特性
* 直观的语法:使用 `fd PATTERN` 而不是 `find -iname '*PATTERN*'`。
* 支持正则表达式(默认)和基于 glob 的模式。
* 由于并行化的目录遍历,速度[非常快](#benchmark)。
* 使用颜色高亮显示不同的文件类型(同 `ls`)。
* 支持[并行命令执行](#command-execution)
* 智能大小写:默认情况下搜索不区分大小写。如果模式包含大写字符[\*](http://vimdoc.sourceforge.net/htmldoc/options.html#'smartcase'),则切换为区分大小写。
* 默认情况下忽略隐藏的目录和文件。
* 默认情况下忽略 `.gitignore` 中的模式。
* 命令名称比 `find` 短了 *50%*[\*](https://github.com/ggreer/the_silver_searcher) :-).
## 演示

## 如何使用
首先,要获取所有可用命令行选项的概览,您可以运行 [`fd -h`](#command-line-options) 获取简洁的帮助信息,或者运行 `fd --help` 获取更详细的版本。
### 简单搜索
*fd* 旨在查找文件系统中的条目。您可以执行的最基本的搜索是使用单个参数运行 *fd*:即搜索模式。例如,假设您想找到您的一个旧脚本(名称中包含 `netflix`):
```
> fd netfl
Software/python/imdb-ratings/netflix-details.py
```
如果像这样只用一个参数调用,*fd* 会在当前目录中递归搜索任何*包含*模式 `netfl` 的条目。
### 正则表达式搜索
搜索模式被视为正则表达式。在这里,我们搜索以 `x` 开头并以 `rc` 结尾的条目:
```
> cd /etc
> fd '^x.*rc$'
X11/xinit/xinitrc
X11/xinit/xserverrc
```
`fd` 使用的正则表达式语法在[这里有文档说明](https://docs.rs/regex/latest/regex/#syntax)。
### 指定根目录
如果我们想搜索特定的目录,可以将其作为 *fd* 的第二个参数给出:
```
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
```
### 递归列出所有文件
*fd* 可以在没有参数的情况下调用。这对于快速概览当前目录中的所有条目(递归地)非常有用(类似于 `ls -R`):
```
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
```
如果您想使用此功能列出给定目录中的所有文件,则必须使用通配模式,例如 `.` 或 `^`:
```
> fd . fd/tests/
testenv
testenv/mod.rs
tests.rs
```
### 搜索特定的文件扩展名
通常,我们对特定类型的所有文件感兴趣。这可以使用 `-e`(或 `--extension`)选项来完成。在这里,我们在 fd 仓库中搜索所有 Markdown 文件:
```
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
```
`-e` 选项可以与搜索模式结合使用:
```
> fd -e rs mod
src/fshelper/mod.rs
src/lscolors/mod.rs
tests/testenv/mod.rs
```
### 搜索特定的文件名
要查找与提供的搜索模式完全匹配的文件,请使用 `-g`(或 `--glob`)选项:
```
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
```
### 隐藏文件和被忽略的文件
默认情况下,*fd* 不搜索隐藏目录,也不在搜索结果中显示隐藏文件。要禁用此行为,我们可以使用 `-H`(或 `--hidden`)选项:
```
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
```
如果我们在一个 Git 仓库(或包含 Git 仓库)的目录中工作,*fd* 不会搜索(也不会显示)匹配 `.gitignore` 模式之一的文件夹(和文件)。要禁用此行为,我们可以使用 `-I`(或 `--no-ignore`)选项:
```
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
```
要真正搜索*所有*文件和目录,只需结合隐藏和忽略功能来显示所有内容(`-HI`)或使用 `-u`/`--unrestricted`。
### 匹配完整路径
默认情况下,*fd* 仅匹配每个文件的文件名。但是,使用 `--full-path` 或 `-p` 选项,您可以匹配完整路径。
```
> fd -p -g '**/.git/config'
> fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)'
```
### 执行命令
除了仅显示搜索结果外,您通常还想对它们*做点什么*。`fd` 提供了两种方法来为每个搜索结果执行外部命令:
* `-x`/`--exec` 选项为*每个搜索结果*运行一个外部命令(并行)。
* `-X`/`--exec-batch` 选项启动一次外部命令,并将*所有搜索结果作为参数*。
#### 示例
递归查找所有 zip 归档文件并解压它们:
```
fd -e zip -x unzip
```
如果有两个这样的文件,`file1.zip` 和 `backup/file2.zip`,这将执行 `unzip file1.zip` 和 `unzip backup/file2.zip`。这两个 `unzip` 进程并行运行(如果文件发现得够快)。
查找所有 `*.h` 和 `*.cpp` 文件,并使用 `clang-format -i` 对其进行原地自动格式化:
```
fd -e h -e cpp -x clang-format -i
```
注意 `clang-format` 的 `-i` 选项是如何作为单独的参数传递的。这就是我们将 `-x` 选项放在最后的原因。
查找所有 `test_*.py` 文件并在您喜欢的编辑器中打开它们:
```
fd -g 'test_*.py' -X vim
```
请注意,我们在这里使用大写的 `-X` 来打开单个 `vim` 实例。如果有两个这样的文件,`test_basic.py` 和 `lib/test_advanced.py`,这将运行 `vim test_basic.py lib/test_advanced.py`。
要查看文件权限、所有者、文件大小等详细信息,您可以告诉 `fd` 通过为每个结果运行 `ls` 来显示它们:
```
fd … -X ls -lhd --color=always
```
这种模式非常有用,因此 `fd` 提供了一个快捷方式。您可以使用 `-l`/`--list-details` 选项以这种方式执行 `ls`:`fd … -l`。
`-X` 选项在将 `fd` 与 [ripgrep](https://github.com/BurntSushi/ripgrep/) (`rg`) 结合使用时也很有用,以便在某类文件中进行搜索,例如所有 C++ 源文件:
```
fd -e cpp -e cxx -e h -e hpp -X rg 'std::cout'
```
将所有 `*.jpg` 文件转换为 `*.png` 文件:
```
fd -e jpg -x convert {} {.}.png
```
在这里,`{}` 是搜索结果的占位符。`{.}` 也是如此,但没有文件扩展名。有关占位符语法的更多详细信息,请参见下文。
使用 `-x` 从并行线程运行的命令的终端输出不会交错或乱码,因此 `fd -x` 可用于粗略地并行化在许多文件上运行的任务。
这方面的一个例子是计算目录中每个文件的校验和。
```
fd -tf -x md5sum > file_checksums.txt
```
#### 占位符语法
`-x` 和 `-X` 选项将*命令模板*作为一系列参数(而不是单个字符串)。如果您想在命令模板之后向 `fd` 添加其他选项,可以使用 `\;` 终止它。
生成命令的语法类似于 [GNU Parallel](https://www.gnu.org/software/parallel/):
- `{}`: 将被替换为搜索结果路径的占位符标记 (`documents/images/party.jpg`)。
- `{.}`: 类似于 `{}`,但没有文件扩展名 (`documents/images/party`)。
- `{/}`: 将被替换为搜索结果的基本名称 (`party.jpg`) 的占位符。
- `{//}`: 发现路径的父目录 (`documents/images`)。
- `{/.}`: 基本名称,移除了扩展名 (`party`)。
如果您不包含占位符,*fd* 会自动在末尾添加一个 `{}`。
#### 并行与串行执行
对于 `-x`/`--exec`,您可以使用 `-j`/`--threads` 选项控制并行作业的数量。使用 `--threads=1` 进行串行执行。
### 排除特定的文件或目录
有时我们想忽略来自特定子目录的搜索结果。例如,我们可能想要搜索所有隐藏的文件和目录(`-H`),但排除 `.git` 目录中的所有匹配项。我们可以使用 `-E`(或 `--exclude`)选项来实现。它接受一个任意的 glob 模式作为参数:
```
> fd -H -E .git …
```
我们也可以使用它来跳过挂载的目录:
```
> fd -E /mnt/external-drive …
```
.. 或者跳过某些文件类型:
```
> fd -E '*.bak' …
```
要使此类排除模式永久生效,您可以创建一个 `.fdignore` 文件。它们的工作方式类似于 `.gitignore` 文件,但是特定于 `fd`。例如:
```
> cat ~/.fdignore
/mnt/external-drive
*.bak
```
如果您希望 `fd` 全局忽略这些模式,可以将它们放在 `fd` 的全局忽略文件中。这通常位于 macOS 或 Linux 的 `~/.config/fd/ignore`,以及 Windows 的 `%APPDATA%\fd\ignore`。
您可能希望在 `fd/ignore` 文件中包含 `.git/`,这样如果您使用 `--hidden` 选项,`.git` 目录及其内容就不会包含在输出中。
### 删除文件
您可以使用 `fd` 删除所有与您的搜索模式匹配的文件和目录。
如果您只想删除文件,可以使用 `--exec-batch`/`-X` 选项来调用 `rm`。例如,要递归删除所有 `.DS_Store` 文件,请运行:
```
> fd -H '^\.DS_Store$' -tf -X rm
```
如果您不确定,请始终先运行不带 `-X rm` 的 `fd`。或者,使用 `rm` 的“交互式”选项:
```
> fd -H '^\.DS_Store$' -tf -X rm -i
```
如果您还想删除某类目录,可以使用相同的技术。您必须使用 `rm` 的 `--recursive`/`-r` 标志来删除目录。
### 命令行选项
这是 `fd -h` 的输出。要查看完整的命令行选项集,请使用 `fd --help`,其中还包括更详细的帮助文本。
```
Usage: fd [OPTIONS] [pattern [path]...]
Arguments:
[pattern] the search pattern (a regular expression, unless '--glob' is used; optional)
[path]... the root directories for the filesystem search (optional)
Options:
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect .(git|fd)ignore files
-s, --case-sensitive Case-sensitive search (default: smart case)
-i, --ignore-case Case-insensitive search (default: smart case)
-g, --glob Glob-based search (default: regular expression)
-a, --absolute-path Show absolute instead of relative paths
-l, --list-details Use a long listing format with file metadata
-L, --follow Follow symbolic links
-p, --full-path Search full abs. path (default: filename only)
-d, --max-depth Set maximum search depth (default: none)
-E, --exclude Exclude entries that match the given glob pattern
-t, --type Filter by type: file (f), directory (d/dir), symlink (l),
executable (x), empty (e), socket (s), pipe (p), char-device
(c), block-device (b)
-e, --extension Filter by file extension
-S, --size Limit results based on the size of files
--changed-within Filter by file modification time (newer than)
--changed-before Filter by file modification time (older than)
-o, --owner Filter by owning user and/or group
--format Print results according to template
-x, --exec ... Execute a command for each search result
-X, --exec-batch ... Execute a command with all search results at once
-c, --color When to use colors [default: auto] [possible values: auto,
always, never]
--hyperlink[=] Add hyperlinks to output paths [default: never] [possible
values: auto, always, never]
--ignore-contain Ignore directories containing the named entry
-h, --help Print help (see more with '--help')
-V, --version Print version
```
请注意,选项也可以在模式和/或路径之后给出。
## 基准测试
让我们在我的主文件夹中搜索以 `[0-9].jpg` 结尾的文件。它包含约 750,000 个子目录和约 400 万个文件。为了进行平均和统计分析,我使用了 [hyperfine](https://github.com/sharkdp/hyperfine)。以下基准测试是在“热”/预填充的磁盘缓存下进行的(“冷”磁盘缓存的结果显示出相同的趋势)。
让我们从 `find` 开始:
```
Benchmark 1: find ~ -iregex '.*[0-9]\.jpg$'
Time (mean ± σ): 19.922 s ± 0.109 s
Range (min … max): 19.765 s … 20.065 s
```
如果不需要执行正则表达式搜索,`find` 会快得多:
```
Benchmark 2: find ~ -iname '*[0-9].jpg'
Time (mean ± σ): 11.226 s ± 0.104 s
Range (min … max): 11.119 s … 11.466 s
```
现在让我们对 `fd` 尝试相同的操作。请注意,`fd` 默认执行正则表达式搜索。为了进行公平比较,这里需要 `-u`/`--unrestricted` 选项。否则 `fd` 不必遍历隐藏文件夹和忽略的路径(见下文):
```
Benchmark 3: fd -u '[0-9]\.jpg$' ~
Time (mean ± σ): 854.8 ms ± 10.0 ms
Range (min … max): 839.2 ms … 868.9 ms
```
对于这个特定示例,`fd` 比 `find -iregex` 快大约 **23 倍**,比 `find -iname` 快大约 **13 倍**。顺便说一句,这两个工具都找到了完全相同的 546 个文件 :smile:。
**注意**:这是*一台特定*机器上的*一个特定*基准测试。虽然我们进行了大量不同的测试(并发现结果一致),但您的情况可能会有所不同!我们鼓励大家在自己的机器上尝试。有关所有必要的脚本,请参阅[此仓库](https://github.com/sharkdp/fd-benchmarks)。
关于 *fd* 的速度,很大程度上归功于 `regex` 和 `ignore` crates,它们也被用于 [ripgrep](https://github.com/BurntSushi/ripgrep)(快去看看吧!)。
## 故障排除
### `fd` 找不到我的文件!
请记住,`fd` 默认忽略隐藏目录和文件。它还忽略 `.gitignore` 文件中的模式。如果您想确保找到绝对所有可能的文件,请始终使用 `-u`/`--unrestricted` 选项(或 `-HI` 以启用隐藏和忽略文件):
```
> fd -u …
```
还要记住,默认情况下,`fd` 仅根据文件名进行搜索,并不会将模式与完整路径进行比较。如果您想根据完整路径进行搜索(类似于 `find` 的 `-path` 选项),您需要使用 `--full-path`(或 `-p`)选项。
### 彩色输出
`fd` 可以按扩展名为文件着色,就像 `ls` 一样。为了实现这一点,必须设置环境变量 [`LS_COLORS`](https://linux.die.net/man/5/dir_colors)。通常,此变量的值由 `dircolors` 命令设置,该命令提供了一种方便的配置格式来定义不同文件格式的颜色。
在大多数发行版中,`LS_COLORS` 应该已经设置好了。如果您使用的是 Windows,或者如果您正在寻找替代的、更完整(或更多彩)的变体,请参见[这里](https://github.com/sharkdp/vivid)、[这里](https://github.com/seebi/dircolors-solarized) 或 [这里](https://github.com/trapd00r/LS_COLORS)。
`fd` 也遵循 [`NO_COLOR`](https://no-color.org/) 环境变量。
### `fd` 似乎没有正确解释我的 regex 模式
许多特殊的正则表达式字符(如 `[] `^`, `$`, ..)在您的 shell 中也是特殊字符。如果有疑问,请务必在正则表达式模式周围加上单引号:
```
> fd '^[A-Z][0-9]+$'
```
如果您的模式以破折号开头,则必须添加 `--` 以表示命令行选项的结束。否则,该模式将被解释为命令行选项。或者,使用包含单个连字符字符的字符类:
```
> fd -- '-pattern'
> fd '[-]pattern'
```
### `alias` 或 shell 函数的“找不到命令”
Shell `alias` 和 shell 函数不能用于通过 `fd -x` 或 `fd -X` 执行命令。在 `zsh` 中,您可以通过 `alias -g myalias="…"` 使别名全局化。在 `bash` 中,您可以使用 `export -f my_function` 使其对子进程可用。您仍然需要调用 `fd -x bash -c 'my_function "$1"' bash`。对于其他用例或 shell,请使用(临时)shell 脚本。
## 与其他程序集成
### 将 fd 与 `fzf` 结合使用
您可以使用 *fd* 为命令行模糊查找器 [fzf](https://github.com/junegunn/fzf) 生成输入:
```
export FZF_DEFAULT_COMMAND='fd --type file'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
```
然后,您可以在终端上键入 `vim ` 来打开 fzf 并搜索 fd 的结果。或者,您可能希望遵循符号链接并包含隐藏文件(但排除 `.git` 文件夹):
```
export FZF_DEFAULT_COMMAND='fd --type file --follow --hidden --exclude .git'
```
您甚至可以通过设置以下内容在 fzf 内部使用 fd 的彩色输出:
```
export FZF_DEFAULT_COMMAND="fd --type file --color=always"
export FZF_DEFAULT_OPTS="--ansi"
```
有关更多详细信息,请参阅 fzf README 的 [Tips 部分](https://github.com/junegunn/fzf#tips)。
### 将 fd 与 `rofi` 结合使用
[*rofi*](https://github.com/davatorium/rofi) 是一个图形化启动菜单应用程序,能够通过从 *stdin* 读取来创建菜单。将 `fd` 输出通过管道传输到 `rofi` 的 `-dmenu` 模式可创建文件和目录的模糊可搜索列表。
#### 示例
在 `$HOME` 目录下创建一个不区分大小写可搜索的 *PDF* 文件多选列表,并使用您配置的 PDF 查看器打开所选内容。要列出所有文件类型,请去掉 `-e pdf` 参数。
```
fd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}
```
要修改 rofi 显示的列表,请向 `fd` 命令添加参数。要修改 rofi 的搜索行为,请向 `rofi` 命令添加参数。
### 将 fd 与 `emacs` 结合使用
emacs 包 [find-file-in-project](https://github.com/technomancy/find-file-in-project) 可以使用 *fd* 来查找文件。
安装 `find-file-in-project` 后,将行 `(setq ffip-use-rust-fd t)` 添加到您的 `~/.emacs` 或 `~/.emacs.d/init.el` 文件中。
在 emacs 中,运行 `M-x find-file-in-project-by-selected` 以查找匹配的文件。或者运行 `M-x find-file-in-project` 列出项目中的所有可用文件。
### 将输出打印为树
要将 `fd` 的输出格式化为文件树,您可以使用带有 `--fromfile` 选项的 `tree` 命令:
```
❯ fd | tree --fromfile
```
这可能比单独运行 `tree` 更有用,因为 `tree` 默认不会忽略任何文件,也不支持像 `fd` 那样丰富的选项集来控制打印内容:
```
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
```
在 bash 和类似环境中,您只需创建一个别名:
```
❯ alias as-tree='tree --fromfile'
```
### 将 fd 与 `xargs` 或 `parallel` 结合使用
请注意,`fd` 具有用于[命令执行](#command-execution)的内置功能,即其 `-x`/`--exec` 和 `-X`/`--exec-batch` 选项。如果您愿意,您仍然可以将其与 `xargs` 结合使用:
```
> fd -0 -e rs | xargs -0 wc -l
```
在这里,`-0` 选项告诉 *fd* 用 NULL 字符(而不是换行符)分隔搜索结果。同样,`xargs` 的 `-0` 选项告诉它以这种方式读取输入。
## 安装
[](https://repology.org/project/fd-find/versions)
### 在 Ubuntu 上
*... 以及其他基于 Debian 的 Linux 发行版。*
如果您运行的是 Ubuntu 19.04 (Disco Dingo) 或更新版本,您可以安装[官方维护的软件包](https://packages.ubuntu.com/fd-find):
```
apt install fd-find
```
请注意,该二进制文件名为 `fdfind`,因为二进制文件名 `fd` 已被另一个软件包使用。建议安装后,通过执行命令 `ln -s $(which fdfind) ~/.local/bin/fd` 添加指向 `fd` 的链接,以便以与本文档相同的方式使用 `fd`。请确保 `$HOME/.local/bin` 在您的 `$PATH` 中。
如果您使用旧版本的 Ubuntu,可以从[发布页面](https://github.com/sharkdp/fd/releases)下载最新的 `.deb` 软件包并通过以下方式安装:
```
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
```
请注意,此项目发布页面上的 .deb 软件包仍将可执行文件命名为 `fd`。
### 在 Debian 上
如果您运行的是 Debian Buster 或更新版本,您可以安装[官方维护的 Debian 软件包](https://tracker.debian.org/pkg/rust-fd-find):
```
apt-get install fd-find
```
请注意,该二进制文件名为 `fdfind`,因为二进制文件名 `fd` 已被另一个软件包使用。建议安装后,通过执行命令 `ln -s $(which fdfind) ~/.local/bin/fd` 添加指向 `fd` 的链接,以便以与本文档相同的方式使用 `fd`。请确保 `$HOME/.local/bin` 在您的 `$PATH` 中。
请注意,此项目发布页面上的 .deb 软件包仍将可执行文件命名为 `fd`。
### 在 Fedora 上
从 Fedora 28 开始,您可以从官方软件源安装 `fd`:
```
dnf install fd-find
```
### 在 Alpine Linux 上
您可以从官方软件源安装 [fd 软件包](https://pkgs.alpinelinux.org/packages?name=fd),前提是您启用了适当的软件源:
```
apk add fd
```
### 在 Arch Linux 上
您可以从官方软件源安装 [fd 软件包](https://www.archlinux.org/packages/extra/x86_64/fd/):
```
pacman -S fd
```
您也可以[从 AUR](https://aur.archlinux.org/packages/fd-git) 安装 fd。
### 在 Gentoo Linux 上
您可以使用官方软件源中的 [fd ebuild](https://packages.gentoo.org/packages/sys-apps/fd):
```
emerge -av fd
```
### 在 openSUSE Linux 上
您可以从官方软件源安装 [fd 软件包](https://software.opensuse.org/package/fd):
```
zypper in fd
```
### 在 Void Linux 上
您可以通过 xbps-install 安装 `fd`:
```
xbps-install -S fd
```
### 在 ALT Linux 上
您可以从官方软件源安装 [fd 软件包](https://packages.altlinux.org/en/sisyphus/srpms/fd/):
```
apt-get install fd
```
### 在 Solus 上
您可以从官方软件源安装 [fd 软件包](https://github.com/getsolus/packages/tree/main/packages/f/fd):
```
eopkg install fd
```
### 在 RedHat Enterprise Linux (RHEL) 8/9/10, Almalinux 8/9/10, EuroLinux 8/9 或 Rocky Linux 8/9/10 上
您可以从 Fedora Copr 安装 [`fd` 软件包](https://copr.fedorainfracloud.org/coprs/tkbcopr/fd/)。
```
dnf copr enable tkbcopr/fd
dnf install fd
```
EPEL8/9 软件源中也提供了一个使用[较慢的](https://github.com/sharkdp/fd/pull/481#issuecomment-534494592) malloc [而不是 jemalloc](https://bugzilla.redhat.com/show_bug.cgi?id=2216193#c1) 的不同版本,软件包名为 `fd-find`。
### 在 macOS 上
您可以使用 [Homebrew](https://formulae.brew.sh/formula/fd) 安装 `fd`:
```
brew install fd
```
… 或者使用 MacPorts:
```
port install fd
```
### 在 Windows 上
您可以从[发布页面](https://github.com/sharkdp/fd/releases)下载预构建的二进制文件。
或者,您可以通过 [Scoop](http://scoop.sh) 安装 `fd`:
```
scoop install fd
```
或者通过 [Chocolatey](https://chocolatey.org):
```
choco install fd
```
或者通过 [Winget](https://learn.microsoft.com/en-us/windows/package-manager/):
```
winget install sharkdp.fd
```
### 在 GuixOS 上
您可以从官方软件源安装 [fd 软件包](https://guix.gnu.org/en/packages/fd-8.1.1/):
```
guix install fd
```
### 在 Mise 上
您可以使用 [mise](https://github.com/jdx/mise) 使用类似这样的命令安装 `fd`:
```
mise use -g fd@latest
```
### 在 NixOS 上 / 通过 Nix
您可以使用 [Nix 软件包管理器](https://nixos.org/nix/) 安装 `fd`:
```
nix-env -i fd
```
### 通过 Flox
您可以使用 [Flox](https://flox.dev) 将 `fd` 安装到 Flox 环境中:
```
flox install fd
```
### 在 FreeBSD 上
您可以从官方软件源安装 [fd-find 软件包](https://www.freshports.org/sysutils/fd):
```
pkg install fd-find
```
### 通过 npm
在 Linux 和 macOS 上,您可以安装 [fd-find](https://npm.im/fd-find) 软件包:
```
npm install -g fd-find
```
### 从源代码构建
使用 Rust 的软件包管理器 [cargo](https://github.com/rust-lang/cargo),您可以通过以下方式安装 *fd*:
```
cargo install fd-find
```
请注意,需要 Rust 版本 *1.77.2* 或更高版本。构建还需要 `make`。
### 从二进制文件
[发布页面](https://github.com/sharkdp/fd/releases) 包含适用于 Linux、macOS 和 Windows 的预编译二进制文件。还提供了静态链接的二进制文件:寻找文件名中带有 `musl` 的归档文件。
## 开发
```
git clone https://github.com/sharkdp/fd
# 构建
cd fd
cargo build
# 运行单元测试和集成测试
cargo test
# 安装
cargo install --path .
```
### 补全
#### 从发布归档中
预构建的补全文件包含在[发布页面](https://github.com/sharkdp/fd/releases)上的发布归档文件(`.tar.gz`/`.zip`)中,位于 `autocomplete` 目录下。
要使用这些补全:
- **bash**: 在您的 `~/.bashrc` 中 source `fd.bash` 文件,或将其放在自动 source 的目录中。
- **zsh**: 将 `_fd` 移动到 `fpath` 中的目录(例如 `~/.zfunc`)。
- **fish**: 将 `fd.fish` 复制到 `~/.config/fish/completions/`。
- **powershell**: 从您的 [profile 脚本](https://learn.microsoft.com/en-us/powershell/scripting/learn/shell/creating-profiles?view=powershell-7.5)之一 source `_fd.ps1`。
#### 从 fd 生成
您还可以使用 `fd --gen-completions ` 直接生成补全:
```
# Bash
fd --gen-completions bash > ~/.local/share/bash-completion/completions/fd
# Zsh (确保 ~/.zfunc 在你的 fpath 中)
fd --gen-completions zsh > ~/.zfunc/_fd
# Fish
fd --gen-completions fish > ~/.config/fish/completions/fd.fish
# PowerShell
fd --gen-completions powershell >> $PROFILE
```
## 维护者
- [sharkdp](https://github.com/sharkdp)
- [tmccombs](https://github.com/tmccombs)
- [tavianator](https://github.com/tavianator)
## 许可证
`fd` 根据 MIT 许可证和 Apache 许可证 2.0 的条款分发。有关许可证详细信息,请参阅 [LICENSE-APACHE](LICENSE-APACHE) 和 [LICENSE-MIT](LICENSE-MIT) 文件。
标签:Awesome, CLI, find替代, Git忽略, Rust, SOC Prime, WiFi技术, 代码搜索, 可视化界面, 并行计算, 开发工具, 性能优化, 搜索工具, 效率提升, 文件搜索, 文件查找, 文件系统, 智能搜索, 检测绕过, 生成式AI, 系统管理, 索引, 网络安全审计, 网络流量审计, 通知系统