[中文] [한국어]
fd
是一个程序,可以在文件系统中找到条目。这是一个简单,快速且用户友好的find
品。尽管它并不是要支持所有find
的强大功能,但它为大多数用例提供了明智的默认功能。
安装•如何使用•故障排除
fd PATTERN
而不是find -iname '*PATTERN*'
。ls
相同)。.gitignore
的模式。find
短50% * :-)。 首先,要获取所有可用命令行选项的概述,您可以运行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 :
> 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
选项启动一次外部命令,所有搜索结果作为参数。 递归找到所有拉链档案并打开它们:
fd -e zip -x unzip
如果有两个这样的文件,即file1.zip
和backup/file2.zip
,这将执行unzip file1.zip
和unzip backup/file2.zip
。两个unzip
过程并行运行(如果发现文件足够快)。
查找所有*.h
和*.cpp
文件,并使用clang-format -i
:自动将它们自动构架-i:
fd -e h -e cpp -x clang-format -i
请注意,如何作为单独的参数clang-format
-i
选项。这就是为什么我们将-x
选项放置。
查找所有test_*.py
文件,然后在您喜欢的编辑器中打开它们:
fd -g ' test_*.py ' -X vim
请注意,我们在此处使用Capital -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
。
当将fd
与RIPGREP( rg
)结合时, -X
选项也很有用,以便在某些类别的文件中搜索,例如所有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并行的语法:
{}
:占位符令牌,将被搜索结果的路径替换( documents/images/party.jpg
)。{.}
:喜欢{}
,但没有文件扩展名( documents/images/party
)。{/}
:将由搜索结果的Basename代替的占位符( party.jpg
)。{//}
:发现路径的父级( documents/images
)。{/.}
,删除扩展名( party
)。如果您不包含占位符,则FD在最后会自动添加一个{}
。
对于-x
/ --exec
,您可以使用-j
/ --threads
选项来控制并行作业的数量。使用--threads=1
用于串行执行。
有时我们想忽略特定子目录的搜索结果。例如,我们可能想搜索所有隐藏的文件和目录( -H
),但将所有匹配项排除在.git
目录中。我们可以为此使用-E
(或--exclude
)选项。它以任意的地球模式为论点:
> fd -H -E .git …
我们还可以使用它来跳过安装的目录:
> fd -E /mnt/external-drive …
..或跳过某些文件类型:
> fd -E ' *.bak ' …
为了使这些永久性这样的排除模式,您可以创建一个.fdignore
文件。它们像.gitignore
文件一样工作,但特定于fd
。例如:
> cat ~ /.fdignore
/mnt/external-drive
* .bak
笔记
fd
还支持其他程序(例如rg
或ag
使用的.ignore
文件。
如果您希望fd
在全球范围内忽略这些模式,则可以将它们放入fd
的全局忽略文件中。这通常位于macOS或linux中的~/.config/fd/ignore
中,而%APPDATA%fdignore
Windows。
您可能希望在fd/ignore
文件中包含.git/
以便.git
目录,如果您使用--hidden
选项,则将其内容不包括在输出中。
您可以使用fd
删除与搜索模式相匹配的所有文件和目录。如果您只想删除文件,则可以使用--exec-batch
/ -X
选项来调用rm
。例如,要递归删除所有.DS_Store
文件,请运行:
> fd -H ' ^.DS_Store$ ' -tf -X rm
如果不确定,请始终首先致电-X rm
fd
或者,使用rm
S“ Interactive”选项:
> fd -H ' ^.DS_Store$ ' -tf -X rm -i
如果您还想删除特定类别的目录,则可以使用相同的技术。您将必须使用rm
s --recursive
/ -r
标志来删除目录。
笔记
在某些情况下,使用fd … -X rm -r
可能会导致比赛条件:如果您有…/foo/bar/foo/…
想要删除名为foo
所有目录首先删除外部foo
目录,导致(无害) “ foo/bar/foo”: rm
调用中没有此类文件或目录”错误。
这是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 <depth> Set maximum search depth (default: none)
-E, --exclude <pattern> Exclude entries that match the given glob pattern
-t, --type <filetype> 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 <ext> Filter by file extension
-S, --size <size> Limit results based on the size of files
--changed-within <date|dur> Filter by file modification time (newer than)
--changed-before <date|dur> Filter by file modification time (older than)
-o, --owner <user:group> Filter by owning user and/or group
--format <fmt> Print results according to template
-x, --exec <cmd>... Execute a command for each search result
-X, --exec-batch <cmd>... Execute a command with all search results at once
-c, --color <when> When to use colors [default: auto] [possible values: auto,
always, never]
--hyperlink[=<when>] Add hyperlinks to output paths [default: never] [possible
values: auto, always, never]
-h, --help Print help (see more with '--help')
-V, --version Print version
让我们搜索我的主文件夹以[0-9].jpg
结尾的文件。它包含〜750.000个子目录和约400万个文件。为了平均和统计分析,我正在使用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个文件?
注意:这是一台特定机器上的一个特殊基准。尽管我们进行了许多不同的测试(并发现了一致的结果),但对您来说可能会有所不同!我们鼓励每个人自己尝试。有关所有必要的脚本,请参见此存储库。
关于FD的速度,很多信用额为regex
,而ignore
RIPGREP中也使用的板条箱(请检查一下!)。
fd
找不到我的文件!请记住, fd
默认情况下忽略了隐藏的目录和文件。它还忽略了.gitignore
文件中的模式。如果要确保确保完全找到所有可能的文件,请始终使用选项-u
/ --unrestricted
选项(或-HI
启用隐藏和忽略的文件):
> fd -u …
fd
可以像ls
一样通过扩展来涂抹文件。为了使其工作,必须设置环境变量LS_COLORS
。通常,该变量的值由dircolors
命令设置,该命令提供了方便的配置格式来定义不同文件格式的颜色。在大多数分布中,应该已经设置LS_COLORS
。如果您在Windows上,或者您正在寻找替代方案,更完整(或更丰富多彩)的变体,请参见此处,此处或此处。
fd
还尊重NO_COLOR
环境变量。
fd
似乎无法正确解释我的正则模式许多特殊的Regex字符(例如[]
, ^
, $
,..)也是您的外壳中的特殊字符。如有疑问,请始终确保在正则表面模式周围放单引号:
> fd ' ^[A-Z][0-9]+$ '
如果您的模式以破折号开头,则必须添加--
以发出命令行选项的结尾。否则,该模式将被解释为命令行选项。或者,使用具有单连丝字符的字符类:
> fd -- ' -pattern '
> fd ' [-]pattern '
alias
ES或Shell功能的“找不到命令” Shell alias
ES和Shell功能不能通过fd -x
或fd -X
使用命令执行。在zsh
中,您可以通过alias -g myalias="…"
使别名全局。在bash
中,您可以使用export -f my_function
向子进程提供。您仍然需要调用fd -x bash -c 'my_function "$1"' bash
。对于其他用例或外壳,请使用(临时)外壳脚本。
fzf
一起使用您可以使用FD为命令行模糊Finder FZF生成输入:
export FZF_DEFAULT_COMMAND= ' fd --type file '
export FZF_CTRL_T_COMMAND= " $FZF_DEFAULT_COMMAND "
然后,您可以在终端上键入vim <Ctrl-T>
以打开FZF并搜索FD-RESULTS。
另外,您可能想遵循符号链接并包含隐藏的文件(但排除.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的提示部分。
rofi
一起使用ROFI是一个图形启动菜单应用程序,能够通过从STDIN阅读来创建菜单。将fd
输出输出到rofi
S -dmenu
模式中创建了可模糊的文件和目录列表。
在您的$HOME
Directory下创建一个不敏感的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
命令中。
emacs
一起使用emacs软件包查找文件可以使用FD查找文件。
安装find-file-in-project
后,将行(setq ffip-use-rust-fd t)
添加到~/.emacs
或~/.emacs.d/init.el
文件中。
在Emacs中,运行Mx find-file-in-project-by-selected
以查找匹配的文件。或者,运行Mx find-file-in-project
以列出项目中的所有可用文件。
要将fd
的输出格式化为文件树,您可以将tree
命令与--fromfile
:
❯ fd | tree --fromfile
这比单独运行tree
更有用,因为tree
默认情况下不会忽略任何文件,也不支持像FD那样富裕的一组选项,就像fd
控制要打印的内容一样:
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
在Bash和类似的情况下,您可以简单地创建一个别名:
❯ alias as-tree= ' tree --fromfile '
xargs
或parallel
请注意, fd
具有具有其-x
/ --exec
和-X
/ --exec-batch
选项的命令执行的内置功能。如果愿意,您仍然可以将其与xargs
结合使用:
> fd -0 -e rs | xargs -0 wc -l
在这里, -0
选项告诉FD通过null字符(而不是newlines)分开搜索结果。以同样的方式, xargs
的-0
选项告诉它以这种方式读取输入。
...以及其他基于Debian的Linux发行版。
如果您运行Ubuntu 19.04(Disco Dingo)或更新,则可以安装正式维护的软件包:
apt install fd-find
请注意,二进制文件称为fdfind
因为二进制名称fd
已由另一个软件包使用。建议在安装后,您通过执行命令ln -s $(which fdfind) ~/.local/bin/fd
添加链接到fd
,以便以与本文档中的方式使用fd
。确保$HOME/.local/bin
处于您的$PATH
中。
如果您使用旧版本的Ubuntu,则可以从发布页面下载最新的.deb
软件包,并通过以下方式安装它。
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
请注意,此项目的发布页面上的.DEB软件包仍将可执行文件命名为“可执行fd
。
如果您运行Debian Buster或Newer,则可以安装正式维护的Debian软件包:
apt-get install fd-find
请注意,二进制文件称为fdfind
因为二进制名称fd
已由另一个软件包使用。建议在安装后,您通过执行命令ln -s $(which fdfind) ~/.local/bin/fd
添加链接到fd
,以便以与本文档中的方式使用fd
。确保$HOME/.local/bin
处于您的$PATH
中。
请注意,此项目的发布页面上的.DEB软件包仍将可执行文件命名为“可执行fd
。
从Fedora 28开始,您可以从官方包装来源安装fd
:
dnf install fd-find
您可以从官方来源安装FD软件包,只要您启用了适当的存储库:
apk add fd
您可以从官方存储库中安装FD包:
pacman -S fd
您也可以从AUR安装FD。
您可以使用官方存储库中的FD EBUILD:
emerge -av fd
您可以从官方存储库中安装FD包:
zypper in fd
您可以通过XBPS安装安装fd
:
xbps-install -S fd
您可以从官方存储库中安装FD包:
apt-get install fd
您可以从官方存储库中安装FD包:
eopkg install fd
您可以从Fedora COPR安装fd
软件包。
dnf copr enable tkbcopr/fd
dnf install fd
使用较慢的Malloc而不是Jemalloc的不同版本也可以从EPEL8/9仓库中作为fd-find
提供。
您可以使用Homebrew安装fd
:
brew install fd
…或Macports:
port install fd
您可以从发布页面下载预构建的二进制文件。
另外,您可以通过scoop安装fd
:
scoop install fd
或通过巧克力:
choco install fd
或通过Winget:
winget install sharkdp.fd
您可以从官方存储库中安装FD包:
guix install fd
您可以使用NIX软件包管理器安装fd
:
nix-env -i fd
您可以使用Flox将fd
安装到Flox环境中:
flox install fd
您可以从官方存储库中安装FD-Find包:
pkg install fd-find
在Linux和MacOS上,您可以安装FD-Find软件包:
npm install -g fd-find
使用Rust的软件包经理货物,您可以安装FD通过:
cargo install fd-find
请注意,Rust版本1.77.2或更高版本。
构建也需要make
。
发布页面包括用于Linux,MacOS和Windows的预编译二进制文件。还可以使用静态链接的二进制文件:在文件名中查找带有musl
的档案。
git clone https://github.com/sharkdp/fd
# Build
cd fd
cargo build
# Run unit tests and integration tests
cargo test
# Install
cargo install --path .
fd
根据MIT许可证和Apache许可证2.0的条款分发。
有关许可证详细信息,请参见许可证和许可-MIT文件。