Finding stuff – find, grep, silver searcher, ripgrep

Here’s how to find stuff in a directory:

grep -r <keyword> .


find . -type f -exec grep <keyword> {} \; -print

or, to exclude a directory:

grep -r --exclude-dir=<directory> <keyword> .


And silver searcher is pretty neat.

e.g. ag <keyword> .

Respects your .gitignore!


Having said that, it doesn’t recognise ** patterns in your .gitignore.

If that’s an issue you might want to try ripgrep.

Incredibly, ripgrep posts timings that are 5x faster than Silver Searcher.


bash: “set -e” and “set -x”

set -e

-e Exit immediately if a command exits with a non-zero status.

set -x

-x Print commands and their arguments as they are executed.


bash-3.2$ help set



Note, there’s an argument (in the SO post) that better practice is:

trap 'do_something' ERR


Bash shortcuts

This avoids having to take your hands off the keyboard to hit the Up arrow to get the last command from the command line (Linux, Mac):

Ctrl P Ctrl J

Ctrl P gets your last command

Ctrl J hits Enter


Delete to end of line: Ctrl K

Delete to beginning of line: `Ctrl U`

My mnemonic? Brexit – the UK leaves Europe…

tree – only show files with matching file name but not directories that don’t contain the file

I want to use tree to only show files that match a specific file name. E.g. filename.

The man page says:

-P pattern
List only those files that match the wild-card pattern. Note: you must use the -a option to also consider those files
beginning with a dot `.' for matching. Valid wildcard operators are `*' (any zero or more characters), `?' (any single
character), `[...]' (any single character listed between brackets (optional - (dash) for character range may be used: ex:
[A-Z]), and `[^...]' (any single character not listed in brackets) and `|' separates alternate patterns.

However, I don’t want to show  directories that don’t contain that file.

Here’s how:

tree . -P filename --prune

(if you don’t have tree then: brew install tree)

and if you want to match on directories too then use:

tree . -P *match string* --matchdirs --prune


Making this an alias:

`alias treefind=”tree . –prune –matchdirs -P”` so you can use it like this:

treefind some_file


and if you’re wanting to use a regex then:

treefind 'some_*'