Skip to content

Latest commit

 

History

History
488 lines (321 loc) · 16.3 KB

readme.md

File metadata and controls

488 lines (321 loc) · 16.3 KB

fd translate-svg

fd是一种简单ㄡ快速和用户友好的find替代方案.」

中文 | english


校对 ✅

翻译的原文 与日期 最新更新 更多
commit ⏰ 2018 8.20 last 中文翻译

贡献

欢迎 👏 勘误/校对/更新贡献 😊 具体贡献请看

生活

If help, buy me coffee —— 营养跟不上了,给我来瓶营养快线吧! 💰


目录

fd

Build Status Build status Version info

fd是一种简单ㄡ快速和用户友好的fd替代方案.

虽然它不寻求复刻find所有强大的功能,但它提供了明智的 (自定的) 80%的用例.

特征

  • 方便语法: fd PATTERN而不是find -iname '*PATTERN*'.
  • 彩色终端输出 (类似于ls)
  • 它是快速的 (见基准下面) .
  • 聪明案例: 默认情况下,搜索不区分大小写. 如果模式包含大写字符*, 则切换为区分大小写字符. .
  • 默认情况下,忽略隐藏的目录和文件.
  • 忽略匹配你.gitignore文件中的模式,默认情况.
  • 正则表达式.
  • Unicode感知.
  • 命令输入量*50%*优于*find: -)
  • 用类似于GNU穿行的语法,执行并行命令.

演示

Demo

基准

让我们搜索我的主文件夹的以[0-9].jpg为结束的文件. 它包含190个子目录和大约一百万个文件. 我使用hyperfine进行平均和统计分析. 下面的基准是用"warm"/预填充的磁盘缓存执行的 (对于"冷"磁盘缓存的结果显示出相同的趋势) .

让我们从find:

Benchmark #1: find ~ -iregex '.*[0-9]\.jpg$'

  Time (mean ± σ):      7.236 s ±  0.090 s

  Range (min … max):    7.133 s …  7.385 s

find如果不需要执行正则表达式搜索,则会更快得多:

Benchmark #2: find ~ -iname '*[0-9].jpg'

  Time (mean ± σ):      3.914 s ±  0.027 s

  Range (min … max):    3.876 s …  3.964 s

现在让我们尝试同样的fd. 注意fd 总是执行正则表达式搜索. 选项--hidden--no-ignore需要自行决策, 下面的fd需要遍历隐藏文件夹和忽略的路径 (见下文) :

Benchmark #3: fd -HI '.*[0-9]\.jpg$' ~

  Time (mean ± σ):     811.6 ms ±  26.9 ms

  Range (min … max):   786.0 ms … 870.7 ms

对于这个特殊的例子,fd大约比find -iregex快九倍,和大约比find -iname快五倍. 顺便说一下,两个工具都找到了完全相同的20880个文件: 😄 .

最后,让我们运行fd没有--hidden--no-ignore选项 (当然,这会导致不同的搜索结果) . 如果fd不必遍历隐藏的和Git忽略的文件夹,它的数量级快了一个数量级:

Benchmark #4: fd '[0-9]\.jpg$' ~

  Time (mean ± σ):     123.7 ms ±   6.0 ms

  Range (min … max):   118.8 ms … 140.0 ms

注释这是在一个特定的机器上的一个特定的基准. 虽然我已经做了很多不同的测试 (并且发现了一致的结果) ,但是事情可能对你来说不同. 我鼓励每个人自己尝试测试. 在这个仓库是所有用于对比的脚本.

关于fd的速度,主要的耗时在regexignore,还有ripgrep箱子 (检查一下!) .

彩色输出

fd可以通过扩展来帮输出着色,就像ls. 为了使这工作,环境变量LS_COLORS必须设置. 通常,此变量的值由dircolors命令控制,它提供了一种方便的配置格式,来定义不同文件格式的颜色. 在大多数分配情况,LS_COLORS应该已经设置好了. 如果您正在寻找替代的,且更完整的 (以及更丰富多彩的) 变体,请参见在这里在这里.

并行命令执行

如果-x/--exec选项与命令模板一起指定,将创建一个作业池,用于并行执行命令,每个发现的路径则作为输入. 生成命令的语法类似于GNU穿行的语法:

  • {}: 将被替换为搜索结果路径的占位符令牌 (documents/images/party.jpg)
  • {.}: 像{},但没有文件扩展名 (documents/images/party)
  • {/}:占位符,将被搜索结果的基名替换 (占位符) . party.jpg)
  • {//}:使用已发现路径的父节点 (documents/images)
  • {/.}:使用BaseNeNe,将扩展名移除 (party)
# 转换 所有 jpg 到  png :
fd -e jpg -x convert {} {.}.png

# Unpack all zip files (if no placeholder is given, the path is appended):
fd -e zip -x unzip

# Convert all flac files into opus files:
fd -e flac -x ffmpeg -i {} -c:a libopus {.}.opus

# Count the number of lines in Rust files (the command template can be terminated with ';'):
fd -x wc -l \; -e rs

安装

Ubuntu

以及其他基于Debian的Linux发行版.

下载最新.deb包装从releases页面并通过以下方式安装:

sudo dpkg -i fd_7.0.0_amd64.deb  # adapt version number and architecture

Fedora

从 FEDORA 28 开始,您可以从官方包装来源安装fd:

dnf install fd-find

对于旧版本,您可以使用Fedora copr安装fd:

dnf copr enable keefle/fd
dnf install fd

Arch Linux

你可以从官方回购安装fd 软件包:

pacman -S fd

Gentoo Linux

你可以从官方回购使用fd 软件包:

emerge -av fd

openSUSE Linux

你可以从官方回购安装fd 软件包:

zypper in fd

Void Linux

你可以安装fd通过xbps安装:

xbps-install -S fd

macOS

你可以安装fd具有brew:

brew install fd

或与Mac port:

sudo port install fd

Windows

您可以从中 releases页面,下载预构建的二进制文件.

或者,您可以安装fd通过Scoop:

scoop install fd

或通过Chocolatey:

choco install fd

NixOS / via Nix

你可以使用NixOS 包管理安装fd:

nix-env -i fd

FreeBSD

你可以安装sysutils/fd通过patmaster:

portmaster sysutils/fd

源码文件

你可以通过rust的包管理cargo安装fd:

cargo install fd-find

注意rust版本要1.20.0或以上.

二进制文件

这个releases页面包括Linux,MaOS和Windows的预编译二进制文件.

开发

git clone https://github.com/sharkdp/fd

# Build
cd fd
cargo build

# Run unit tests and integration tests
cargo test

# Install
cargo install

命令行选项

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选项同样告诉它以这种方式读取输入.

与其他程序的集成

使用fd与fzf

你可以使用fd生成fzf命令行模糊查找器的输入:

export FZF_DEFAULT_COMMAND='fd --type file'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

然后,您可以键入vim <Ctrl-T>在你的终端打开FZF,也即是fd的搜索结果.

或者,您可能喜欢遵循符号链接并包含隐藏文件 (但不包括.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 reamde文件的提示部分.

使用fd与emacs

Emacs封装了find-file-in-project包, 这可以使用fd查找文件.

安装find-file-in-project后,添加行(setq ffip-use-rust-fd t)在你的~/.emacs~/.emacs.d/init.el文件中.

在Emacs中,运行M-x find-file-in-project-by-selected查找匹配文件. 或者,运行M-x find-file-in-project列出项目中所有可用的文件.