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

安装

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

sudo dnf install fd-find

也可以直接下载编译好的文件
https://github.com/sharkdp/fd/releases

下载:
fd-v8.2.1-x86_64-unknown-linux-gnu.tar.gz

解压
tar zxvf fd-v8.2.1-x86_64-unknown-linux-gnu.tar.gz

移动
mv fd-v8.2.1-x86_64-unknown-linux-gnu.tar.gz /usr/local

链接
ln -s /usr/local/fd-v8.2.1-x86_64-unknown-linux-gnu/fd /usr/bin/fd

使用

在当前目录搜索

fd yaml 
Prometheus-master/kubernetes/kube-state-metrics/cluster-role-binding.yaml
Prometheus-master/kubernetes/kube-state-metrics/cluster-role.yaml
Prometheus-master/kubernetes/kube-state-metrics/deployment.yaml
Prometheus-master/kubernetes/kube-state-metrics/service-account.yaml
Prometheus-master/kubernetes/kube-state-metrics/service.yaml

在指定目录搜索

fd yaml /

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

fd -e yaml

你也可以通过提供 -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 返回所有文件。

命令行选项

USAGE:
    fd [FLAGS/OPTIONS] [<pattern>] [<path>...]

FLAGS:
    -H, --hidden            搜索隐藏的文件和目录
    -I, --no-ignore         不要忽略 .(git | fd)ignore 文件匹配
        --no-ignore-vcs     不要忽略.gitignore文件的匹配
    -s, --case-sensitive    区分大小写的搜索(默认值:智能案例)
    -i, --ignore-case       不区分大小写的搜索(默认值:智能案例)
    -F, --fixed-strings     将模式视为文字字符串
    -a, --absolute-path     显示绝对路径而不是相对路径
    -L, --follow            遵循符号链接
    -p, --full-path         搜索完整路径(默认值:仅限 file-/dirname)
    -0, --print0            用null字符分隔结果
    -h, --help              打印帮助信息
    -V, --version           打印版本信息

OPTIONS:
    -d, --max-depth <depth>        设置最大搜索深度(默认值:无)
    -t, --type <filetype>...       按类型过滤:文件(f),目录(d),符号链接(l),
                                   可执行(x),空(e)
    -e, --extension <ext>...       按文件扩展名过滤
    -x, --exec <cmd>               为每个搜索结果执行命令
    -E, --exclude <pattern>...     排除与给定glob模式匹配的条目
        --ignore-file <path>...    以.gitignore格式添加自定义忽略文件
    -c, --color <when>             何时使用颜色:never,*auto*, always
    -j, --threads <num>            设置用于搜索和执行的线程数
    -S, --size <size>...           根据文件大小限制结果。

ARGS:
    <pattern>    the search pattern, a regular expression (optional)
    <path>...    the root directory for the filesystem search (optional)

教程

首先,为了获得所有可用的命令行选项的概述,您可以运行fd -h的简明帮助消息 (见上文) 或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:

> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd

仅运行fd

fd可以不带参数调用. 这是非常有用的,以便快速地查看当前目录中的所有条目,递归地 (类似于ls -R) :

> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs

搜索特定的文件扩展名

通常,我们对特定类型的所有文件感兴趣. 这可以用-e (或) --extension选择权. 在这里,我们搜索FD仓库中的所有md文件:

> 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

隐藏和忽略的文件

默认情况下,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)

排除特定文件或目录

有时我们希望忽略来自特定子目录的搜索结果. 例如,我们可能要搜索所有隐藏的文件和目录 (-H,但仍会排除所有.git目录. 我们可以使用-E (或) --exclude选择此选项. 它以任意的模式作为一个参数:

> fd -H -E .git …

我们也可以用这个来跳过安装的目录:

> fd -E /mnt/external-drive …

或跳过某些文件类型:

> fd -E '*.bak' …

为了让这些模式永久不变,你可以创建一个.fdignore文件. 他们工作得很像.gitignore文件. 例如:

> cat ~/.fdignore
/mnt/external-drive
*.bak

使用fd 带xargsparallel

如果我们想在所有搜索结果上运行命令,我们可以将输出管xargs:

> fd -0 -e rs | xargs -0 wc -l

这里,-0选项告诉fd用空字符 (而不是换行符) 分隔搜索结果. 以同样的方式,xargs-0选项同样告诉它以这种方式读取输入.