{ Finding Files and Folders. }

Objectives

By the end of this chapter, you should be able to:

  • compare and contrast find and grep
  • use find to search for files and folders
  • use grep to search for patterns in a string or text
  • define what a regular expression is

find

One of the most useful terminal commands is the find command. When you know how to use it well, you can easily find files on your computer without using Spotlight, Alfred or any other GUI. Let's get started by learning how the syntax works.

To find a specific file in your current directory, you can simply type find and the name of the file. (If you try to find a folder you will find all of the contents inside as well.) For example, if try typing the following command from your home directory:

find Downloads

You should see a list of all your Downloads in the terminal.

To find something with a bit more complexity, use the following pattern

  1. find
  2. a filepath
  3. an expression (this is where you have the most flexibility)

Let's cd into a folder called views and try this pattern to find anything with the name first.txt inside of the views folder:

find . -name "first.txt"

Now this is nice if we know exactly the name of the file we are looking for, but many times we need to use wildcard characters including *, ? and []. The difference between these characters is as follows:

* - any number of characters
? - one character
[] - any of the characters inside the brackets

Here are some more examples:

  • find inside of the views folder (assume we are inside the views folder) anything that ends with .html => find . -name "*.html"
  • find inside of the views folder (assume we are inside the views folder) anything that ends with a three letter file extension like .txt or .css => find . -name "*.???"
  • find inside of the views folder (assume we are inside the views folder) anything that starts with the letter f t or s => find . -name "[fts]*"
  • find inside of the views folder anything that has the text main somewhere in the filename (this could be the beginning as well) find . -name "*main*"

grep

Another extremely useful tool for finding information that we've seen before is grep. While find is for files and folders, grep is excellent for searching for specific values in a string or in a text file. If you type grep on its own, it's not that valuable because you need to make sure you pass a filename and text to it. You can also use grep with piping and cat.

We have already seen examples using grep with cat to find words like cat people.txt | grep Elie to find if the word Elie exists in the people.txt file. Let's use the file below which we will call names.txt as an example:

Lisa
Mark
Elie
Beth
Tim
Elizabeth
Tom
Matt
Liza
Janey
Jane
Shana

Let's add a little more onto our knowledge of grep and introduce some flags.

  • -i for case insensitive search

grep -i "elie" names.txt => Elie

  • -w for full word search

grep -i "beth" names.txt

Beth
Elizabeth

grep -iw "beth" names.txt => Beth

  • -A display a certain number of lines after

grep -A 3 "Beth" names.txt

Beth
Tim
Elizabeth
Tom
  • -B display a certain number of lines lines before

grep -B 3 "Beth" names.txt

Lisa
Mark
Elie
Beth
  • -C display a certain number of lines lines around

grep -C 3 "Beth" names.txt

Lisa
Mark
Elie
Beth
Tim
Elizabeth
Tom
  • -v invert pattern (you can think of this as anything NOT what you are searching for)

grep -v "Jane" names.txt

Lisa
Mark
Elie
Beth
Tim
Elizabeth
Tom
Matt
Liza
Shana
  • -c count matches

grep -c "Jane" names.txt => 2

  • -n show line number

grep -ni "Jane" names.txt

10:Janey
11:Jane

There are many more flags with grep; you can google around for more or look at man grep.

Wildcards with grep

We previously saw wildcards with find, so how can we use them with grep? The key is to use regular expressions. Regular expressions are used to define patterns in a string of characters, which are then used to search a text for potential matches. Regular expressions are common and quite powerful: you can use them to check whether a user has submitted a properly formatted email address or phone number, for instance.

We will not go in depth with regular expressions here. There are a number of great interactive references online. For now, but let's just take a look at a couple examples of the syntax:

. - matches any character

Example: How many names have a full name that is four characters long?

grep -wc "...." names.txt => 7

* - match zero or more of the preceding character or expression.

Example: How many names start with a capital T?

grep -wc "T.*" names.txt => 2

[] - any specific characters

Example: How many names start with a capital L, M, or E?

grep -wc "[LME].*" names.txt => 6

[^] - do not match

Example How many names do not start with a capital T?

grep -wc "[^T].*" names.txt => 10

When you're ready, move on to Intermediate Terminal Exercises

Continue

Creative Commons License