Linux 安装 fd , 替代 find 命令
【一】引言
- 今天给大家推荐一个好用+开源的文件搜索工具
- fd 支持大多数主流操作系统,快来更新你的工具箱感受开源项目带来的便利吧
【二】fd介绍
【1】引入
- 你还在为寻找文件而烦恼吗?你还在为记不住
find
一大堆参数而烦恼吗? - 那就赶快来看看我这次推荐的项目 fd 吧!
【2】项目地址
- 项目地址:https://github.com/sharkdp/fd
- 官方简介:A simple, fast and user-friendly alternative to 'find'
【3】演示
【4】优势
- fd 是一个命令行工具,提供了多种方便的选项进行文件的搜索,而且默认是彩色输出。
- 项目本身是由 Rust 语言编写的,作为系统级编程语言 Rust 拥有媲美 C++ 的运行速度,那 fd 的速度自然也不在话下,更优秀的是,它提供了强大功能方便用户按照各种条件进行搜索。
【5】特征
- 直观的语法:而不是 .
fd PATTERN``find -iname '*PATTERN*'
- 正则表达式(默认)和基于 glob 的模式。
- 由于并行化目录遍历,速度非常快。
- 使用颜色突出显示不同的文件类型(与 相同)。
ls
- 支持并行命令执行
- 智能大小写:默认情况下,搜索不区分大小写。它切换到 区分大小写(如果模式包含大写) 字符*。
- 默认情况下,忽略隐藏的目录和文件。
- 默认情况下,忽略 中的模式。
.gitignore
- 命令名称比 :-* 短 50%。
find
【三】官方安装介绍
- fd 提供了各个操作系统平台的安装方式,再不济可以直接通过源码进行安装
- (前提是有 Rust 的环境)
【1】Ubuntu
- ...以及其他基于 Debian 的 Linux 发行版。
- 如果您运行的是 Ubuntu 19.04(Disco Dingo)或更高版本,则可以安装官方维护的软件包:
sudo apt install fd-find
- 请注意,调用二进制文件是因为二进制名称已被另一个包使用。
- 建议在安装后,通过执行命令添加指向的链接,以便以与本文档中相同的方式使用。
- 确保它位于您的 .
fdfind``fd``fd``ln -s $(which fdfind) ~/.local/bin/fd``fd``$HOME/.local/bin``$PATH
- 如果您使用的是旧版本的 Ubuntu,则可以从发布页面下载最新的软件包并通过以下方式安装:
.deb
sudo dpkg -i fd_8.7.0_amd64.deb # adapt version number and architecture
【2】Debian
- 如果您运行的是 Debian Buster 或更高版本,您可以安装官方维护的 Debian 软件包:
sudo apt-get install fd-find
- 请注意,调用二进制文件是因为二进制名称已被另一个包使用。
- 建议在安装后,通过执行命令添加指向的链接,以便以与本文档中相同的方式使用。
- 确保它位于您的 .
fdfind``fd``fd``ln -s $(which fdfind) ~/.local/bin/fd``fd``$HOME/.local/bin``$PATH
【3】Fedora
- 从 Fedora 28 开始,你可以从官方软件包源安装:
fd
dnf install fd-find
【4】Alpine Linux
- 您可以从官方来源安装 fd 包,前提是您启用了相应的存储库:
apk add fd
【5】Arch Linux
- 您可以从官方存储库安装 fd 包:
pacman -S fd
【6】Gentoo Linux
- 您可以使用官方存储库中的 fd ebuild:
emerge -av fd
【7】openSUSE Linux
- 您可以从官方存储库安装 fd 包:
zypper in fd
【8】Void Linux
- 您可以通过 xbps 安装进行安装:
fd
xbps-install -S fd
【9】RedHat Enterprise Linux 8 (RHEL8)、Almalinux 8、EuroLinux 8 或 Rocky Linux 8
- 你可以从Fedora Copr安装
fd
软件包。
dnf copr enable tkbcopr/fd
dnf install fd
- EPEL8 存储库中还提供了使用较慢的 malloc 而不是 jemalloc 的不同版本。
【10】macOS
- 您可以使用自制软件安装:
fd
brew install fd
brew
也可以一键升级brew upgrade fd
- ...或使用 MacPorts:
sudo port install fd
【11】Windows
scoop install fd
- 或通过Chocolatey
choco install fd
- 或通过Winget:
- 这个可以安装完成
winget install sharkdp.fd
【12】GuixOS
- 您可以从官方存储库安装 fd 包:
guix install fd
【12】NixOS / via Nix
- 您可以使用 Nix 包管理器安装:
fd
nix-env -i fd
【13】FreeBSD
- 您可以从官方存储库安装 fd-find 包:
pkg install fd-find
【14】npm 安装
- 在 Linux 和 macOS 上,您可以安装 fd-find 软件包:
npm install -g fd-find
【15】源码编译
- 使用 Rust 的包管理器 cargo,您可以通过以下方式安装 fd:
cargo install fd-find
- 请注意,需要 rust 版本 1.64.0 或更高版本。
make
也是构建所必需的。
【15】二进制文件
- 发布页面包括适用于 Linux、macOS 和 Windows 的预编译二进制文件。
- 静态链接的二进制文件也可用:查找文件名中的存档。
musl
【四】Windows/Linux/MacOS
【1】Windows
- 命令
winget install sharkdp.fd
- 演示
C:\Users\Administrator>scoop install fd
'scoop' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Users\Administrator>winget install sharkdp.fd
“msstore”源要求在使用前查看以下协议。
Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
源要求将当前计算机的 2 个字母的地理区域发送到后端服务才能正常工作,(例如"US")。
是否同意所有源协议条款?
[Y] 是 [N] 否: Y
已找到 fd [sharkdp.fd] 版本 8.7.0
此应用程序由其所有者授权给你。
Microsoft 对第三方程序包概不负责,也不向第三方程序包授予任何许可证。
正在下载 https://github.com/sharkdp/fd/releases/download/v8.7.0/fd-v8.7.0-x86_64-pc-windows-msvc.zip
██████████████████████████████ 1.07 MB / 1.07 MB
已成功验证安装程序哈希
正在提取存档...
已成功提取存档
正在启动程序包安装...
添加了命令行别名: "fd"
已修改路径环境变量;重启 shell 以使用新值。
已成功安装
【2】Linux
- 大前提:一定要安装
cargo
cargo
是 Rust 的包管理工具,编译fd
需要使用它。- 安装命令
yum install cargo
方法一:使用 Cargo 安装
fd
是用 Rust 编写的,可以使用 Rust 的包管理工具Cargo
安装它。- 首先,确保您已经安装了 Rust 和 Cargo。然后,可以执行以下步骤:
-
安装
fd-find
:cargo install fd-find
-
添加
fd
到系统路径:echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.bashrc source ~/.bashrc
现在,您应该能够在终端中使用 fd
命令。
方法二:从源代码编译安装
- 您还可以从源代码编译并安装
fd
,这需要一些额外的步骤:
-
安装编译工具和依赖项:
sudo yum install -y git gcc make automake autoconf
-
克隆
fd
代码库:git clone https://github.com/sharkdp/fd.git
-
进入
fd
目录:cd fd
-
编译和安装
fd
:./configure make sudo make install
- 这将安装
fd
到系统路径中。
方法三:使用 Copr 存储库安装
- 您还可以使用 Copr 存储库来安装
fd
。执行以下步骤:
-
启用 Fedora Copr 存储库:
sudo dnf copr enable tkbcopr/fd
-
安装
fd
:sudo dnf install fd
- 以上是在 CentOS 上安装
fd
的几种方法之一。 - 您可以根据您的偏好选择其中一种方法进行安装。
- 安装完成后,您可以在终端中使用
fd
命令来查找文件和目录。
【3】MacOS
- 本地的 Mac 使用
brew
$ brew install fd
brew
也可以一键升级
$ brew upgrade fd
【五】查看帮助
- 无论哪种方式安装完成后,就可以直接使用了
-h
或--help
获取帮助了 --help
就不演示了,区别就是换成了详细的帮助说明- 如果你以后忘记了某一个参数也记得使用
--help
来查看
$ fd -h
fd 8.2.1
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>... 根据文件大小限制结果。
...
【六】fd 快速上手演示
- 为了能让之后的演示有一个统一的认识,我这里新建了一个目录作为 fd 的测试目录,我虚构了一些文件和目录来模拟实际情况,包括一个隐藏目录,我之后的演示都会基于该根目录下,选项如果有短名称和长名称,示例中以短名称为例。
- 该目录大致是这样:
.
├── .hg
│ ├── HelloDjango.md
│ ├── HelloRust.md
│ ├── HelloVue.md
│ ├── HelloZooKeeper.md
├── dir1
│ ├── Hello.java
│ ├── World.java
│ └── dir2
│ ├── demo.py
│ ├── demo1.py
│ ├── dir3
│ │ ├── fd_demo.rs
│ │ └── fd_help.rs
│ └── sss.py
├── hello_fd.md
├── hello_java.md
├── java
│ ├── Hello.java
│ └── World.java
├── my_java.txt
├── python
│ ├── demo.py
│ ├── demo1.py
│ └── sss.py
└── rust
│ ├── fd_demo.rs
│ └── fd_help.rs
├── softdir3 -> dir1/dir2/dir3
└── sss.py -> dir1/dir2/sss.py
【1】简单搜索
fd
直接跟想要搜索的内容,会递归搜索当前目录下的所有文件,列出文件名中包含目标内容的结果(结果为当前目录的相对路径)
$ fd Hello
dir1/Hello.java
java/Hello.java
【2】包含隐藏目录
- 选项
-H
或--hidden
$ fd -H Hello
.hg/HelloDjango.md
.hg/HelloRust.md
.hg/HelloVue.md
.hg/HelloZooKeeper.md
dir1/Hello.java
java/Hello.java
【3】大小写
- 默认
fd
是匹配智能大小写的,如果你搜索的内容是包含大写会按照大小写精确匹配,但如果是小写会忽略大小写匹配,所以fd
另外提供了两种选项来严格控制大小写匹配 - 选项
-i
或--ignore-case
忽略大小写。
$ fd -i Hello
dir1/Hello.java
hello_fd.md
hello_java.md
java/Hello.java
- 选项
-s
或--case-sensitive
严格匹配大小写。
$ fd -s hello
hello_fd.md
hello_java.md
【4】返回绝对路径
- 选项
-a
或--absolute-path
:
$ fd -a Hello
/Users/junjiexun/fd_test/dir1/Hello.java
/Users/junjiexun/fd_test/java/Hello.java
【5】返回文件列表详情
- 选项
-l
或--list-details
获得类似ls -l
的效果。
$ fd -l hello
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/Hello.java
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:37 hello_fd.md
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:37 hello_java.md
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:38 java/Hello.java
【6】搜索内容包含路径
- 选项
-p
或--full-path
不单单搜索文件名,还列出目录中包含目标内容的结果。 - 因为这个测试的目录就在
/Users/junjiexun
下面,所以这样搜索相当于全部的文件都会被搜索出来。
$ fd xun
Nothing return...
$ fd -p xun
dir1
dir1/Hello.java
dir1/World.java
dir1/dir2
...(略)
【7】包括 .gitignore 里的文件
- 选项
-I
或--no-ignore
我这里新建了一个.gitignore
文件内容只有一个*.java
用来演示,并且需要把当前目录通过git init
初始化成 git 的项目。 - 不加该参数,可以看到结果集中
.java
的文件都被过滤了。
$ fd java
hello_java.md
java
my_java.txt
- 加上了
-I
之后结果中又包括了.java
结尾的文件了。
$ fd -I java
dir1/Hello.java
dir1/World.java
hello_java.md
java
java/Hello.java
java/World.java
my_java.txt
-I
功能我演示完了,为了之后的演示,我将.gitignore
和.git
目录给删除了。- 这些简单的功能已经可以满足一半的日常搜索需求了,接下来我们看看
fd
提供的更高级的搜索选项吧!
【七】高级搜索选项
【1】按深度
- 选项
-d
或--max-depth <depth>
,当前路径算深度 1,dir3
下面的rs
文件就是深度 4 了。
$ fd rs
dir1/dir2/dir3/fd_demo.rs
dir1/dir2/dir3/fd_help.rs
rust/fd_demo.rs
rust/fd_help.rs
$ fd -d 3 rs
rust/fd_demo.rs
rust/fd_help.rs
【2】按文件类型
-
选项
-t
或--type <filetype>
,fd
提供了以下几种filetype
选项:-
f:file
-
d:directory
-
l:symlink
-
x:executable
-
e:empty
-
s:socket
-
p:pipe
-
$ fd -t l
softdir3
sss.py
$ fd -t d
dir1
dir1/dir2
dir1/dir2/dir3
java
python
rust
- 我给所有的 py 文件都加了可执行权限
$ fd -t x
python/demo.py
python/demo1.py
python/sss.py
【3】按扩展名
- 选项
-e
或--extension <ext>
$ fd -e md
hello_fd.md
hello_java.md
【4】排除
- 选项
-E
或--exclude <pattern>
支持通配符,排除所有包含字母s
的结果。
$ fd -E '*s*'
dir1
dir1/Hello.java
dir1/World.java
dir1/dir2
dir1/dir2/demo.py
dir1/dir2/demo1.py
dir1/dir2/dir3
hello_fd.md
hello_java.md
java
java/Hello.java
java/World.java
my_java.txt
python
python/demo.py
python/demo1.py
- 可以看到所有的 rust、rs、sss、soft 都没有出现在结果集中。
【5】按所有者
- 选项
-o
或--owner <user:group>
$ fd -l -o junjiexun
drwxr-xr-x 5 junjiexun staff 160B 3 1 18:42 dir1
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/Hello.java
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/World.java
drwxr-xr-x 6 junjiexun staff 192B 3 1 18:42 dir1/dir2
-rw-r--r-- 1 junjiexun staff 0B 3 1 18:42 dir1/dir2/demo.py
...(略)
- 或者
fd -l -o junjiexun:staff
也可以达到同样的效果,但是fd
不支持单独搜索 group,也不支持通配符,如果你有想法的话可以给他提 issue 哦~
【6】组合命令
fd
提供了-x
或--exec <cmd>
、-X
或--exec-batch <cmd>
来进行对搜索结果集的进一步处理- 找到所有和 java 匹配的内容并且删除!(仅仅用做演示,
rm -rf
慎用)
$ fd java -X rm -rf
- 找到所有的 py 并且通过 vim 打开
$ fd py -X vim
- 还可以使用诸如
unzip
、ls
、convert
等等其他常用的命令,也可以直接使用 *unix 语法|
管道符语法进一步处理。
【7】正则表达式
- 对于文件的内容搜索,我之前演示的是诸如 Hello、java、py 都是这样的完整文本,实际
fd
默认就是支持正则表达式对内容进行搜索的,但是正则表达式需要使用单引号'
包裹起来,我下面演示:将所有 s 开头的文件都能被搜索出来。
$ fd '^s.*'
dir1/dir2/sss.py
python/sss.py
softdir3
sss.py
- 如果你不想使用正则表达式,想换成更简单的通配符匹配的话就可以使用选项
-g
或--glob
可以达到同样的效果。
$ fd -g 's*'
dir1/dir2/sss.py
python/sss.py
softdir3
sss.py
- 上面的选项大部分都是可以同时使用的,篇幅有限我这里就不继续演示了。
【八】总结
fd
是一个简单友好的命令行文件搜索工具,而且其开源的属性作为 Rust 源码学习的对象也是非常优秀的,赶紧学起来吧!
【九】声明
-
本文引自
-
原作者:HelloGitHub
- 感谢大佬的分享
-
本文只做学习笔记使用,如有侵权,请联系我删除相关内容。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17677449.html