Linux Terminal - The Ultimate Cheat Sheet - Part 2

linux terminal beginners

Series:

1Linux Terminal - The Ultimate Cheat Sheet

2Linux Terminal - The Ultimate Cheat Sheet - Part 2

This post is the second part of a series that will help you learn how to benefit from the Linux Terminal. If you didn't see my first post, I highly recommend taking a look at it before continuing with this one.

💡 If you found this content valuable, you can follow me on Twitter to get updates about upcoming posts

TL;DR

  • Search with Grep
    • Search for a string within a file ➜ grep [term-to-search] [source-file-to-search]
    • Case Insensitive Search within a file ➜ grep -i [term-to-search] [source-file-to-search]
    • Search for non-matching lines within a file ➜ grep -v [term-to-search] [source-file-to-search]
    • Recursive search within a directory ➜ grep -r [term-to-search] [path-to-directory-to-search]
    • Multiple searches within a file ➜ grep -E "[first-term-to-search|second-term-to-search]" [source-file-to-search]
    • Count search results ➜ grep -c [term-to-search] [source-file-to-search]
    • Showing the name of the matching files ➜ grep -l [term-to-search] [matching-files-to-search]
    • Learn more about grep ➜ man grep

  • Pipes
    • Piping commands ➜ [command 1] | [command 2] | [command n]
    • Piping filtered search results into a new file ➜ ls | grep [term-to-filter] | cat > [path-to-new-file]/[name-for-new-file]
    • Searching through your command history ➜ history | grep "[term-to-search]"

  • Permissions: Change file mode bits command (chmod)
    • Add execute permission to everyone ➜ chmod a+x [name-of-the-file] or chmod +x [name-of-the-file]
    • Remove execute permission to everyone ➜ chmod a-x [name-of-the-file] or chmod -x [name-of-the-file]
    • Add execute permission to the owner ➜ chmod u+x [name-of-the-file]
    • Remove write permission to others users ➜ chmod o-w [name-of-the-file]
    • Add read permission to the group ➜ chmod g+r [name-of-the-file]
    • Remove write and read permission to everyone ➜ chmod a-wr [name-of-the-file]
    • Remove write and read permission to everyone for all the files in the current directory ➜ chmod a-wr *.*

  • Groups
    • List all the available groups ➜ getent group
    • List all the groups my account is assigned to ➜ groups
    • Search for a specific group (using pipes) ➜ getent group | grep [group-name-to-search]
    • Create a new group ➜ sudo groupadd [name-for-the-new-group]
    • Add an existing user to a secondary group ➜ usermod -a -G [group-you-want-to-add-the-user-to] [user-name-to-add]

  • Ownership: Change file owner and group (chown)
    • Change user ownership for a file ➜ sudo chown [new-owner-name] [file-to-change-ownership]
    • Change user ownership for several files ➜ sudo chown [new-owner-name] [file-1-to-change-ownership] [file-n-to-change-ownership]
    • Change user ownership for a directory ➜ sudo chown [new-owner-name] [directory-to-change-ownership]
    • Recursively change user ownership for a directory and all it's files ➜ sudo chown -R [new-owner-name] [directory-to-change-ownership]
    • Change group ownership for a file ➜ sudo chown :[new-group-name] [file-to-change-ownership]
    • Change user and group ownership for a file ➜ sudo chown [new-owner-name]:[new-group-name] [file-to-change-ownership]

  • Shortcuts
    • Search through your search history ➜ [CTRL] + r. Then type a few characters to find you command
    • Paste previous lines ➜ [CTRL] + p
    • Moves the cursor to the beginning of the line. ➜ [CTRL] + a
    • Moves the cursor to the end of the line. ➜ [CTRL] + e
    • Moves the cursor forward one character. ➜ [CTRL] + f
    • Moves the cursor backward one character. ➜ [CTRL] + b
    • Erases the complete line. ➜ [CTRL] + u
    • Erases the last word typed. ➜ [CTRL] + w

  • Working with long files
    • Print the last lines for a file ➜ tail [name-of-the-file]
    • Print the last n lines for a file ➜ tail -n [number-of-lines] [name-of-the-file]
    • Print the first lines for a file ➜ head [name-of-the-file]
    • Print the first n lines for a file ➜ head -n [number-of-lines] [name-of-the-file]
    • Page through a file ➜ less [name-of-the-file]

Global regular expression search (grep command)

The Linux grep command is a string and pattern matching utility that displays matching lines from multiple files.

Search for a string within a file

Type grep [term-to-search] [source-file-to-search] to search for a term within a file. You can optionally add the -n argument if you want to print the line number for each match

## List the content for the working directory
[email protected]:~/projects/landing-page$ ls
README.md  index.html  main.js  script.txt

## Print the content of the index.html file
[email protected]:~/projects/landing-page$ cat index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>My Website</title>
  </head>

  <body>
    <script src="js/main.js"></script>
  </body>
</html>

## Search for "meta" within the index.html file using grep
[email protected]:~/projects/landing-page$ grep meta index.html -n
4:    <meta charset="utf-8" />
5:    <meta http-equiv="x-ua-compatible" content="ie=edge" />
6:    <meta name="viewport" content="width=device-width, initial-scale=1" />

Case Insensitive Search within a file

Type grep -i [term-to-search] [source-file-to-search] to perform a case insensitive search:

## Print the content of the main.js file
[email protected]:~/projects/landing-page$ cat main.js
const sum = (num1, num2) => {
        return num1 + num2
}

// Call the Sum function
sum(10,4)

## Search for "sum" without ignoring case (we get 2 results)
[email protected]:~/projects/landing-page$ grep sum main.js -n
1:const sum = (num1, num2) => {
6:sum(10,4)

## Search for "sum" using the ignore case argument (we get 3 results)
[email protected]:~/projects/landing-page$ grep sum main.js -in
1:const sum = (num1, num2) => {
5:// Call the Sum function
6:sum(10,4)

Search for non-matching lines within a file

Type grep -v [term-to-search] [source-file-to-search] to get all the lines within a file that don't match with the term

## Print the content of the main.js file
[email protected]:~/projects/landing-page$ cat main.js
const sum = (num1, num2) => {
        return num1 + num2
}

// Call the Sum function
sum(10,4)

## Search for each line that doesn't include "sum" (case sensitive)
[email protected]:~/projects/landing-page$ grep sum main.js -v
        return num1 + num2
}

// Call the Sum function

Recursive search within a directory

Type grep -r [term-to-search] [path-to-directory-to-search] to search through nested directories and subdirectories.

## List the content for the working directory
[email protected]:~/projects/landing-page$ ls
README.md  index.html  main.js  script.txt  temp

## Search recursively for "sum" within the current directory (including sub-directories)
[email protected]:~/projects/landing-page$ grep -r sum .
./index.html:    <p>Calling the sum function:<p>
./index.html:    <!-- TODO: Call the sum function and display the value -->
./main.js:const sum = (num1, num2) => {
./main.js:sum(10,4)
./temp/index.html:    <p>Calling the sum function:<p>
./temp/index.html:    <!-- TODO: Call the sum function and display the value -->

Multiple searches within a file

Type grep -E "[first-term-to-search|second-term-to-search]" [source-file-to-search] to search for multiple terms within a file

## Print the content of the main.js file
[email protected]:~/projects/landing-page$ cat main.js
const sum = (num1, num2) => {
        return num1 + num2
}

// Call the Sum function
sum(10,4)

const printMessage(message) {
        console.log(message)
}

// Call the printMessage function
printMessage("Hello world")

## Search for "sum" or "printMessage" within the main.js file
[email protected]:~/projects/landing-page$ grep -E "sum|printMessage" main.js
const sum = (num1, num2) => {
sum(10,4)
const printMessage(message) {
// Call the printMessage function
printMessage("Hello world")

Count search results

Type grep -c [term-to-search] [source-file-to-search] to count how many times a search term appears in the file

## List the content for the working directory
[email protected]:~/projects/landing-page$ ls
README.md  index.html  main.js  script.txt  temp

## Count how many times "sum" appears on the main.js file
[email protected]:~/projects/landing-page$ grep -c sum main.js
2

## Count how many times "sum" or "printMessage" appears on the main.js file 
[email protected]:~/projects/landing-page$ grep -c -E "sum|printMessage" main.js
5

## Recursive count to get how many times "sum" or "printMessage" appears in the current working directory
[email protected]:~/projects/landing-page$ grep -c -E -r "sum|printMessage" .
./index.html:2
./main.js:5
./README.md:0
./script.txt:0
./temp/index.html:2

Showing the name of the matching files

Type grep -l [term-to-search] [matching-files-to-search] to get a list of files that includes the search term

## List the content for the working directory
[email protected]:~/projects/landing-page$ ls
README.md  about.html  index.html  main.js  script.txt  temp

## Get a list of html files that contains "<h1>"
[email protected]:~/projects/landing-page$ grep -l "<h1>" *.html
index.html

## Get a list of html files that contains "<p>"
[email protected]:~/projects/landing-page$ grep -l "<p>" *.html
about.html
index.html

## Recursively get a list of files that contains "<p>" within the current directory
[email protected]:~/projects/landing-page$ grep -l -r "<p>" .
./about.html
./index.html
./temp/index.html

Pipes

Pipes are among the most useful command-line features on Linux and allow you to perform complex operations by "piping" multiple operations together, which means that the output of each command within the pipe will serve as an input for the next command.

Piping filtered search results into a new file

Let's say I want to get a list of all my blog posts that have the word "svelte" within the title. And I want to write the full list on a new file called svelte-articles.txt.

We can use pipes to list all my articles, filter those that include "svelte" using grep, and save that filtered list on a new file.

## Check that my current working directory is the "posts" folder that includes all my posts
[email protected]:~/projects/maurogarcia.dev/posts$ pwd
/home/mauro_codes/projects/maurogarcia.dev/posts

## Piping the list of posts with grep to check how many posts include the term "svelte" (I get five items)
[email protected]:~/projects/maurogarcia.dev/posts$ ls | grep svelte
5

## Piping the list of post --> Filter svelte posts --> move the content to a new file using cat
[email protected]:~/projects/maurogarcia.dev/posts$ ls | grep svelte | cat > /home/mauro_codes/projects/svelte-articles.txt

## Print the content of our new file
[email protected]:~/projects/maurogarcia.dev/posts$ cat /home/mauro_codes/projects/svelte-articles.txt
-rw-r--r-- 1 mauro_codes mauro_codes 4.2K Jan 27 18:29 -5-things-i-love-about-svelte-.md
-rw-r--r-- 1 mauro_codes mauro_codes  11K Jan 27 18:29 angular-vs-svelte-card-component.md
-rw-r--r-- 1 mauro_codes mauro_codes 5.3K Jan 27 18:29 component-driven-development-with-svelte.md
-rw-r--r-- 1 mauro_codes mauro_codes 5.0K Jan 27 18:29 how-to-build-your-next-chrome-extension-with-svelte.md
-rw-r--r-- 1 mauro_codes mauro_codes 4.7K Jan 27 18:29 sapper-svelte-tailwindcss-boilerplate.md

Searching through your command history

You can use pipes to search through your command history using grep by typing history | grep "[term-to-search]"

Thanks to @bradnichol for suggesting this approach in my previous post!

## Searching for the term svelte on your command history
[email protected]:~$ history | grep "svelte"
  415  ls | grep svelte
  416  ls | grep -C svelte
  417  ls | grep -c svelte
  418  ls | grep -c svelte |
  419  ls | grep -c svelte | cat
  420  ls | grep svelte | cat
  421  ls | grep svelte | cat > /home/mauro_codes/projects/svelte-articles.txt
  422  cat /home/mauro_codes/projects/svelte-articles.txt
  444  ls grep -c svelte
  445  ls | grep -c svelte
  446  cat /home/mauro_codes/projects/svelte-articles.txt
  448  history | grep "svelte"

Permissions: Change file mode bits command (chmod)

Changing permissions in Linux is an extensive topic that deserves its own post. But I decided to include a few examples that can come in handy.

You can use the chmod command to add or remove the read, write, and execute permissions to different users for one or more files.

As a reference, here is an example of how the permissions are displayed for each file or directory when we use ls lah

Linux permissions

Add the execute permission to everyone

Type chmod a+x [name-of-the-file] or chmod +x [name-of-the-file] to add execute permission to everyone for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---------- 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Add execute permission to everyone in the main.js file
[email protected]:~/projects/landing-page$ chmod +x main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Remove the execute permission to everyone

Type chmod a-x [name-of-the-file] or chmod -x [name-of-the-file] to remove execute permission to everyone for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rwxrwxrwx 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Remove the execute permissions to everyone in the main.js file
[email protected]esktop:~/projects/landing-page$ chmod a-x main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rw-rw-rw- 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Add the execute permission to the owner

Type chmod u+x [name-of-the-file] to add the execute permission only to the owner for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---------- 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Add the execute permissions only to the owner in the main.js file
[email protected]:~/projects/landing-page$ chmod u+x main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x------ 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Remove write permission to other users

Type chmod o-w [name-of-the-file] to remove the write permission only to other users (not owner or group) for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rwxrwxrwx 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Remove the write permission only to other users (not owner or group) in the main.js file
[email protected]:~/projects/landing-page$ chmod o-w main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rwxrwxr-x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Add read permission to the group

Type chmod g+r [name-of-the-file] to add read permission only to the group for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---------- 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Add the read permission only to the group in the main.js file
[email protected]:~/projects/landing-page$ chmod g+r main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
----r----- 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---------- 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Remove write and read permission to everyone

Type chmod a-wr [name-of-the-file] to remove write and read permissions to everyone for a specific file

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rwxrwxrwx 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Remove the write and read permission to everyone in the main.js file
[email protected]:~/projects/landing-page$ chmod a-wr main.js

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Remove write and read permission to everyone for multiple files

Type chmod a-wr *.* to remove the write and read permissions to everyone for all the files in the current working directory.

## Check file permissions
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
-rwxrwxrwx 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
-rwxrwxrwx 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Remove the write and read permissions to everyone for all the files in the current working directory
[email protected]:~/projects/landing-page$ chmod a-wr *.*

## Check permissions again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Groups

List all the available groups

Type getent group to get a list including all the available groups in your system.

[email protected]:~/projects/landing-page$ getent group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
mauro_codes:x:1000:

List all the groups my account is assigned to

Type groups to get a list of all the groups you are part of.

## List all my groups
[email protected]:~/projects/landing-page$ groups
mauro_codes adm dialout cdrom floppy sudo audio dip video plugdev netdev

Search for a specific group (using pipes)

Type getent group | grep [group-name-to-search] to search for a specific group using pipes.

## List all the groups that contains the term "mauro_codes"
[email protected]:~/projects/landing-page$ getent group | grep "mauro_codes"
adm:x:4:syslog,mauro_codes
mauro_codes:x:1000:

## List all the groups that contains the term "root"
[email protected]:~/projects/landing-page$ getent group | grep "root"
root:x:0:

Create a new group

Type sudo groupadd [name-for-the-new-group] to create a new group.

## Create a new group called "development"
[email protected]:~/projects/landing-page$ sudo groupadd development

## Check if the new group was created
[email protected]:~/projects/landing-page$ getent group | grep development
development:x:1001:

Add an existing user to a secondary group

Type usermod -a -G [group-you-want-to-add-the-user-to] [user-name-to-add] to add an existing user to a secondary group.

## Add mauro_codes to the secondary group "development"
[email protected]:~/projects$ sudo usermod -a -G development mauro_codes

## Check changes
[email protected]:~/projects$ getent group | grep "mauro"
adm:x:4:syslog,mauro_codes
dialout:x:20:mauro_codes
mauro_codes:x:1000:
development:x:1001:mauro_codes

Ownership: Change file owner and group (chown)

Change user ownership for a file

Type sudo chown [new-owner-name] [file-to-change-ownership] to change user ownership for a file.

## Check user ownership
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Change user ownership (the root user will be the owner of the main.js file)
[email protected]:~/projects/landing-page$ sudo chown root main.js

## Check user ownership again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 root        mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Change user ownership for several files

Type sudo chown [new-owner-name] [file-1-to-change-ownership] [file-n-to-change-ownership] to change user ownership for several files at the same time.

## Check user ownership
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Change user ownership (the root user will be the owner of the main.js and script.txt files)
[email protected]:~/projects/landing-page$ sudo chown root main.js script.txt

## Check user ownership again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 root        mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 root        mauro_codes  23 Jan 24 17:31 script.txt

Change user ownership for a directory

Type sudo chown [new-owner-name] [directory-to-change-ownership] to change the user ownership for a directory.

## Check directories user ownership
[email protected]:~/projects$ ls -lah
total 4.0K
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 28 10:48 ..
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 landing-page
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 22 12:15 personal-blog

## Change user ownership (the root user will be the owner of the "landing-page" directory)
[email protected]:~/projects$ sudo chown root ./landing-page/

## Check directories user ownership again
[email protected]:~/projects$ ls -lah
total 4.0K
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 28 10:48 ..
drwxr-xr-x 1 root        mauro_codes 512 Jan 27 17:49 landing-page
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 22 12:15 personal-blog

Recursively change user ownership for a directory and all its files

Type sudo chown -R [new-owner-name] [directory-to-change-ownership] to recursively change the user ownership for a directory and all its files.

## Check files ownershop within the landing-page directory
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 root        mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 16:27 temp_dir

## Recursively change the user ownership (the root user will be the owner 
## of all the files and directories within the current directory)
[email protected]:~/projects/landing-page$ sudo chown -R root .

## Check user ownership again
[email protected]:~/projects/landing-page$ ls -lah
total 0
drwxr-xr-x 1 root        mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 root        mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 root        mauro_codes  23 Jan 24 17:31 script.txt
drwxr-xr-x 1 root        mauro_codes 512 Jan 27 16:27 temp_dir

Change group ownership for a file

Type sudo chown :[new-group-name] [file-to-change-ownership] to change the group ownership for a file.

## Check group ownership
[email protected]:~/projects/landing-page$ ls
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Change group ownership (the main.js file will now have "development" as a group)
[email protected]:~/projects/landing-page$ sudo chown :development main.js

## Check group ownership again
[email protected]:~/projects/landing-page$ ls
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes development 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Change user and group ownership for a file

Type sudo chown [new-owner-name]:[new-group-name] [file-to-change-ownership] to change the user and the group ownership for a file at the same time.

## Check ownership
[email protected]:~/projects/landing-page$ ls
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 mauro_codes mauro_codes 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

## Change user and group ownership (the main.js file will now have "development" as a group and root as owner)
[email protected]:~/projects/landing-page$ sudo chown root:development main.js

## Check ownership again
[email protected]:~/projects/landing-page$ ls
total 0
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 17:49 .
drwxr-xr-x 1 mauro_codes mauro_codes 512 Jan 27 20:00 ..
---x--x--x 1 root        development 206 Jan 27 16:36 main.js
---x--x--x 1 mauro_codes mauro_codes  23 Jan 24 17:31 script.txt

Shortcuts

Big shout-out to @bogkonstantin and @samuelabreu for letting me know about these commands I didn't know.

Search through your command history

In the previous post, we saw that we could get a full list of the latest commands we run by typing history. If you don't want to see the full list but search for a specific command quickly, type [CTRL] + r. You'll be asked to enter a few characters to get matching commands. You can iterate between those results by typing [CTRL] + r again.

Moving through your commands

There are a few shortcuts you can use to move through your commands:

  • Paste previous lines ➜ [CTRL] + p
  • Moves the cursor to the beginning of the line. ➜ [CTRL] + a
  • Moves the cursor to the end of the line. ➜ [CTRL] + e
  • Moves the cursor forward one character. ➜ [CTRL] + f
  • Moves the cursor backward one character. ➜ [CTRL] + b
  • Erases the complete line. ➜ [CTRL] + u
  • Erases the last word typed. ➜ [CTRL] + w

Working with long files

  • Print the last lines for a file ➜ tail [name-of-the-file]
  • Print the last n lines for a file ➜ tail -n [number-of-lines] [name-of-the-file]
  • Print the first lines for a file ➜ head [name-of-the-file]
  • Print the first n lines for a file ➜ head -n [number-of-lines] [name-of-the-file]
  • Page through a file ➜ less [name-of-the-file]