summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2016-02-10 20:39:30 -0500
committerTavian Barnes <tavianator@tavianator.com>2016-02-10 20:39:30 -0500
commitfc3b5fab4cb4f9a20671e17e31126f360b0e941a (patch)
tree9ac53536002b2a104ddf8e0f46f1e5d721b5245c
parent0f09fc54fdf6d5cd453ea0e9fb363756baf87dae (diff)
downloadbfs-fc3b5fab4cb4f9a20671e17e31126f360b0e941a.tar.xz
Add a README.
-rw-r--r--README.md93
1 files changed, 93 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b33464b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,93 @@
+`bfs`
+=====
+
+Breadth-first search for your files.
+
+`bfs` is a variant of the UNIX `find` command that operates [breadth-first](https://en.wikipedia.org/wiki/Breadth-first_search) rather than [depth-first](https://en.wikipedia.org/wiki/Depth-first_search).
+It is otherwise intended to be [compatible](https://github.com/tavianator/bfs/issues/6) with GNU `find`.
+If you're not familiar with `find`, have a look at the [GNU find manual](https://www.gnu.org/software/findutils/manual/html_mono/find.html) to get acquainted first.
+
+
+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:
+
+<pre>
+haystack
+├── deep
+│ └── 1
+│ └── 2
+│ └── 3
+│ └── 4
+│ └── ...
+└── shallow
+ └── <strong>needle</strong>
+</pre>
+
+`find` will explore the entire `deep` directory tree before it ever gets to the `shallow` one that contains what you're looking for.
+
+<pre>
+$ <strong>find</strong> haystack
+haystack
+haystack/deep
+haystack/deep/1
+haystack/deep/1/2
+haystack/deep/1/2/3
+haystack/deep/1/2/3/4
+...
+haystack/shallow
+<strong>haystack/shallow/needle</strong>
+</pre>
+
+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.
+
+<pre>
+$ <strong>bfs</strong> haystack
+haystack
+haystack/deep
+haystack/shallow
+haystack/deep/1
+<strong>haystack/shallow/needle</strong>
+haystack/deep/1/2
+haystack/deep/1/2/3
+haystack/deep/1/2/3/4
+...
+</pre>
+
+
+Easy
+----
+
+`bfs` tries to be easier to use than `find`, while remaining compatible.
+For example, `bfs` is less picky about where you put its arguments:
+
+<pre>
+$ <strong>find</strong> -L -name 'needle' <em>haystack</em>
+find: paths must precede expression: haystack
+$ <strong>bfs</strong> -L -name 'needle' <em>haystack</em>
+<strong>haystack/needle</strong>
+
+$ <strong>find</strong> <em>haystack</em> -L -name 'needle'
+find: unknown predicate `-L'
+$ <strong>bfs</strong> <em>haystack</em> -L -name 'needle'
+<strong>haystack/needle</strong>
+
+$ <strong>find</strong> -L <em>haystack</em> -name 'needle'
+<strong>haystack/needle</strong>
+$ <strong>bfs</strong> -L <em>haystack</em> -name 'needle'
+<strong>haystack/needle</strong>
+</pre>
+
+`bfs` also adds some extra options that make some common tasks easier.
+Compare `bfs -nohidden` to `find -name '.?*' -prune -o -print`.
+
+
+Pretty
+------
+
+When `bfs` detects that its output is a terminal, it automatically colors its output with the same colors `ls` uses.
+This makes it easier to identify relevant files at a glance.
+
+![Screenshot](http://i.imgur.com/5V6Sxw5.png)