在Linux上用fd代替find

323 阅读2分钟

许多Linux程序员在他们的职业生涯中每天都在使用find 命令。但是find 给出的文件系统条目是有限的,如果你要进行大量的find 操作,它甚至不是非常快。因此,相反,我更喜欢使用Rustfd 命令,因为它提供了合理的默认值,适用于大多数使用情况。

正如它的README所说,"fd 是一个在你的文件系统中寻找条目的程序。它是find 的一个简单、快速和用户友好的替代品"。它的特点是并行的目录遍历,因此它可以一次搜索多个目录。它支持正则表达式(regex)和基于glob的模式。

安装 fd

在Linux上,你可以从你的软件库中安装fd (可用软件包的列表可以在Repology上的fd页面找到。)例如,在Fedora上。

$ sudo dnf install fd-find

在macOS上,使用MacPortsHomebrew

另外,你也可以使用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上的文档

总结

我特别喜欢fd ,因为它的搜索模式默认是不区分大小写的,这使得即使你对你要找的东西有不精确的了解,也能更容易找到东西。更好的是,如果模式包含一个大写字母,它就会_自动_ 转换为大小写敏感。

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

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