Breadth-first search for your files.
If you're not familiar with
find, the GNU find manual provides a good introduction.
Breadth vs. depth
The advantage of breadth-first over depth first search is that it usually finds the file(s) you're looking for faster. Imagine the following directory tree:
haystack ├── deep │ └── 1 │ └── 2 │ └── 3 │ └── 4 │ └── ... └── shallow └── needle
find will explore the entire
deep directory tree before it ever gets to the
shallow one that contains what you're looking for.
$ find haystack haystack haystack/deep haystack/deep/1 haystack/deep/1/2 haystack/deep/1/2/3 haystack/deep/1/2/3/4 ... haystack/shallow haystack/shallow/needle
On the other hand,
bfs lists files from shallowest to deepest, so you never have to wait for it to explore an entire unrelated subtree.
$ bfs haystack haystack haystack/deep haystack/shallow haystack/deep/1 haystack/shallow/needle haystack/deep/1/2 haystack/deep/1/2/3 haystack/deep/1/2/3/4 ...
bfs tries to be easier to use than
find, while remaining compatible.
bfs is less picky about where you put its arguments:
$ find -L -name 'needle' haystack find: paths must precede expression: haystack $ bfs -L -name 'needle' haystack haystack/needle $ find haystack -L -name 'needle' find: unknown predicate `-L' $ bfs haystack -L -name 'needle' haystack/needle $ find -L haystack -name 'needle' haystack/needle $ bfs -L haystack -name 'needle' haystack/needle
bfs also adds some extra options that make some common tasks easier.
bfs -name config -exclude -name .git
find ! \( -name .git -prune \) -name config
bfs may already be packaged for your distribution of choice.
Alpine Linux # apk add bfs Debian/Ubuntu # apt install bfs NixOS # nix-env -i bfs Void Linux # xbps-install -S bfs FreeBSD # pkg install bfs MacPorts # port install bfs Homebrew $ brew install tavianator/tap/bfs
This will build the
bfs binary in the current directory.
You can test it out:
$ ./bfs -nohidden
If you're interested in speed, you may want to build the release version instead:
$ make clean $ make release
Finally, if you want to install it globally, run
$ sudo make install