在 Linux 上用 fd 代替 find
fd 命令是一个流行的、用户友好的 find 命令的替代品。
find 查找
fd 命令是一个流行的、用户友好的 find 命令的替代品。

> 
> fd 命令是一个流行的、用户友好的 find 命令的替代品。
> 
> 
> 


![](/data/attachment/album/202106/24/110546npqmttwobtqpo4qk.jpg "Magnifying glass on code")


许多 Linux 程序员在其工作中每天都在使用 `find` 命令。但是 `find` 给出的文件系统条目是有限的，如果你要进行大量的 `find` 操作，它甚至不是很快速。因此，我更喜欢使用 Rust 编写的 `fd` 命令，因为它提供了合理的默认值，适用于大多数使用情况。


正如它的 [README](https://github.com/sharkdp/fd) 所说，“`fd` 是一个在文件系统中寻找条目的程序。它是一个简单、快速和用户友好的 `find` 的替代品。”它的特点是目录的并行遍历，可以一次搜索多个目录。它支持正则表达式（regex）和基于通配符的模式。


### 安装 fd


在 Linux 上，你可以从你的软件库中安装 `fd`（可用的软件包列表可以在 [Repology 上的 fd 页面](https://repology.org/project/fd-find/versions) 找到）。 例如，在 Fedora 上：



```
$ sudo dnf install fd-find

```

在 macOS 上，可以使用 [MacPorts](https://opensource.com/article/20/11/macports) 或 [Homebrew](https://opensource.com/article/20/6/homebrew-mac)。


另外，你也可以使用 Rust 的 Cargo 软件包管理器：



```
$ cargo install fd-find

```

### 使用 fd


要做一个简单的搜索，运行 `fd` 并在后面跟上要搜索的名字，例如：



```
$ fd sh
registry/src/github.com-1ecc6299db9ec823/cc-1.0.67/src/bin/gcc-shim.rs
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.bash
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.fish
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.zsh
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/xtests/run.sh
registry/src/github.com-1ecc6299db9ec823/git2-0.13.18/src/stash.rs
registry/src/github.com-1ecc6299db9ec823/libc-0.2.94/src/unix/solarish
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/cmake/SelectHashes.cmake
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/stash.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/sys/hashsig.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/backport.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/leaks.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/valgrind.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/src/config_snapshot.c
[...]

```

如果你想搜索一个特定的目录，可以将目录路径作为 `fd` 的第二个参数，例如：



```
$ fd passwd /etc
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
/etc/security/opasswd

```

要搜索一个特定的文件扩展名，使用 `-e` 作为选项。例如：



```
$ fd . '/home/ssur/exa' -e md
/home/ssur/exa/README.md
/home/ssur/exa/devtools/README.md
/home/ssur/exa/man/exa.1.md
/home/ssur/exa/man/exa_colors.5.md
/home/ssur/exa/xtests/README.md
$

```

你也可以通过提供 `-x` 或 `-X` 来执行一个命令。


* `-x`/`--exec`：选项为每个搜索结果（并行）运行一个外部命令。
* `-X`/`--exec-batch`：选项将所有搜索结果作为参数启动一次外部命令。


例如，要递归地找到所有的 ZIP 档案并解压：



```
$ fd -e zip -x unzip

```

或者，要列出某个特定目录下在过去 *n* 天内改变的所有文件，使用`--changed-within` 选项：



```
$ fd . '/home/ssur/Work/' --changed-within 10d
/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcDriverAdd.java
/home/ssur/Work/wildfly/connector/src/main/java/org/jboss/as/connector/subsystems/data_sources/JdbcExample.java
[...]

```

而要搜索所有在特定天数之前被修改的文件，请使用 `--changed-before` *n* 选项：



```
$ fd . '/home/ssur/Work/' --changed-before 365d

```

这里，`.` 作为一个（正则）通配符，指示 `fd` 返回所有文件。


要了解更多关于 `fd` 的功能，请查阅 GitHub 上的 [文档](https://github.com/sharkdp/fd)。


### 总结


我特别喜欢 `fd` 的一点是，搜索模式默认是不区分大小写的，这使得它更容易找到东西，即使你对你要找的东西没有精确的认识。更好的是，如果模式包含一个大写的字符，它就会*自动*切换到大小写敏感。


另一个好处是，它使用颜色编码来突出不同的文件类型。


如果你已经在使用这个神奇的 Rust 工具，请在评论中告诉我们你的想法。




---


via: <https://opensource.com/article/21/6/fd-linux>


作者：[Sudeshna Sur](https://opensource.com/users/sudeshna-sur) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

