[中文] [한국어]
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
似乎無法正確解釋我的正則模式許多特殊的正則角色(例如[]
, ^
, $
,..)也是您的外殼中的特殊字符。如有疑問,請始終確保在正則表面模式周圍放單引號:
> 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文件。