如何在 Linux 上用 fd 代替 find
fd 命令是一個流行的、用戶友好的 find 命令的替代品。
許多 Linux 程序員在其工作中每天都在使用 find
命令。但是 find
給出的文件系統(tǒng)條目是有限的,如果你要進(jìn)行大量的 find
操作,它甚至不是很快速。因此,我更喜歡使用 Rust 編寫的 fd
命令,因?yàn)樗峁┝撕侠淼哪J(rèn)值,適用于大多數(shù)使用情況。
正如它的 README 所說,“fd
是一個在文件系統(tǒng)中尋找條目的程序。它是一個簡單、快速和用戶友好的 find
的替代品。”它的特點(diǎn)是目錄的并行遍歷,可以一次搜索多個目錄。它支持正則表達(dá)式(regex)和基于通配符的模式。
安裝 fd
在 Linux 上,你可以從你的軟件庫中安裝 fd
(可用的軟件包列表可以在 Repology 上的 fd 頁面 找到)。 例如,在 Fedora 上:
$ sudo dnf install fd-find
在 macOS 上,可以使用 MacPorts 或 Homebrew。
另外,你也可以使用 Rust 的 Cargo 軟件包管理器:
$ cargo install fd-find
使用 fd
要做一個簡單的搜索,運(yùn)行 fd
并在后面跟上要搜索的名字,例如:
$ fd sh
registry/src/github.com-1ecc6299db9ec823/cc-1.0.67/src/bin/gcc-shim.rs
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.bash
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.fish
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/completions/completions.zsh
registry/src/github.com-1ecc6299db9ec823/exa-0.10.1/xtests/run.sh
registry/src/github.com-1ecc6299db9ec823/git2-0.13.18/src/stash.rs
registry/src/github.com-1ecc6299db9ec823/libc-0.2.94/src/unix/solarish
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/cmake/SelectHashes.cmake
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/stash.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/include/git2/sys/hashsig.h
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/backport.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/leaks.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/script/valgrind.sh
registry/src/github.com-1ecc6299db9ec823/libgit2-sys-0.12.19+1.1.0/libgit2/src/config_snapshot.c
[...]
如果你想搜索一個特定的目錄,可以將目錄路徑作為 fd
的第二個參數(shù),例如:
$ fd passwd /etc
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
/etc/security/opasswd
要搜索一個特定的文件擴(kuò)展名,使用 -e
作為選項(xiàng)。例如:
$ fd . '/home/ssur/exa' -e md
/home/ssur/exa/README.md
/home/ssur/exa/devtools/README.md
/home/ssur/exa/man/exa.1.md
/home/ssur/exa/man/exa_colors.5.md
/home/ssur/exa/xtests/README.md
$
你也可以通過提供 -x
或 -X
來執(zhí)行一個命令。
-x
/--exec
:選項(xiàng)為每個搜索結(jié)果(并行)運(yùn)行一個外部命令。-X
/--exec-batch
:選項(xiàng)將所有搜索結(jié)果作為參數(shù)啟動一次外部命令。
例如,要遞歸地找到所有的 ZIP 檔案并解壓:
$ fd -e zip -x unzip
或者,要列出某個特定目錄下在過去 n 天內(nèi)改變的所有文件,使用--changed-within
選項(xiàng):
$ 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
[...]
而要搜索所有在特定天數(shù)之前被修改的文件,請使用 --changed-before
n 選項(xiàng):
$ fd . '/home/ssur/Work/' --changed-before 365d
這里,.
作為一個(正則)通配符,指示 fd
返回所有文件。
要了解更多關(guān)于 fd
的功能,請查閱 GitHub 上的 文檔。
總結(jié)
我特別喜歡 fd
的一點(diǎn)是,搜索模式默認(rèn)是不區(qū)分大小寫的,這使得它更容易找到東西,即使你對你要找的東西沒有精確的認(rèn)識。更好的是,如果模式包含一個大寫的字符,它就會自動切換到大小寫敏感。
另一個好處是,它使用顏色編碼來突出不同的文件類型。
如果你已經(jīng)在使用這個神奇的 Rust 工具,請?jiān)谠u論中告訴我們你的想法。