Many Linux programmers use the
find command every single day of their career. But
find gives a limited set of filesystem entries, and if you have to do a large set of
find operations, it's not even very fast. So instead, I prefer to use the Rust
fd command because it provides sensible defaults that work for most use cases.
As its README says, "
fd is a program to find entries in your filesystem. It is a simple, fast, and user-friendly alternative to
find." It features parallelized directory traversal, so it can search multiple directories at once. It supports regular expressions (regex) and glob-based patterns.
On Linux, you can install
fd from your software repository (a list of available packages can be found on the fd page on Repology.) For example, on Fedora:
$ sudo dnf install fd-find
Alternately, you can use Rust's Cargo package manager:
$ cargo install fd-find
To do a simple search, run
fd after any argument, such as:
$ 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 [...]
If you want to search for a specific directory, provide the directory path as a second argument to
fd, such as:
$ fd passwd /etc /etc/pam.d/passwd /etc/passwd /etc/passwd- /etc/security/opasswd
To search for a particular file extension, use
-e as an option. For example:
$ 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 $
You can also execute a command by providing
-x/--execoption runs an external command for each search result (in parallel).
-X/--exec-batchoption launches the external command once with all search results as arguments.
For example, to recursively find all ZIP archives and unpack them:
$ fd -e zip -x unzip
Or, to list all files under a particular directory that were changed within the last n number of days, use the
$ 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 [...]
And to search all files that were changed before a specific number of days, use the
--changed-before n option:
$ fd . '/home/ssur/Work/' --changed-before 365d
. acts as a wildcard entry to instruct
fd to return all files.
To learn about more the functionalities of
fd, consult its documentation on GitHub.
One thing I especially like about
fd is that the search pattern is case-insensitive by default, which makes it easier to find things even when you have imprecise knowledge about what you're looking for. Better yet, it automatically switches to case-sensitive if the pattern contains an uppercase character.
Another benefit is that it uses color-coding to highlight different file types.
If you are already using this amazing Rust tool, please let us know your thoughts in the comments.