2.2. BASH commands#

To begin familiarizing yourself with the terminal, we first provide an overview of commonly used BASH commands (Table 2.1), which are explained in more detail below on this page. The overview is not exhaustive - if you want to perform an action not covered by the table, search online to find an appropriate command. To run a command on your computer, simply open your terminal, type in the command, and press Enter.

2.2.2. Manipulating directories#

With the terminal you can easily create (mkdir A/) or delete an empty directory A/ (rmdir A/), where A/ can be something like Movies/ in the figure above. You can also use rm to delete directories, cp to copy, and mv to move and rename them.

If you have a directory with files inside (i.e, a non-empty directory), you cannot use rmdir to delete it. In order to delete a non-empty directory with all its contents, you need to use rm in a recursive fashion: rm -r A/.

Similarly, if you wish to make a copy of a directory (with all its contents), this also has to be done recursively. Notice the nuanced differences between the following commands:

  • cp -r A/ new_A/ - makes a copy of the source directory A/ with all its contents; the new folder is called new_A/.

  • cp -r A new_A/ - same as previous command.

  • cp -r A/ existing_A/ - copies the contents of the source directory A/ to the existing destination directory existing_A.

  • cp -r A existing_A/ - makes a copy of the directory A/ with all its contents inside the existing directory existing_A. Therefore, the presence or absence of the trailing slash / in the source directory determines whether the entire directory is copied as a subdirectory or only its contents are copied.

In addition to copying, we can also move directories. To move directory A/ with all its contents into directory B/, we can use mv A/ B/ (note: mv doesn’t differentiate based on the presence or absence of a trailing slash in the source directory). We can also use mv to rename a directory like this: mv A/ new_name_A/.

Recalling previous commands

Sometimes you want to use the same command you used recently in your terminal, either to run it again, or make a small modification and then run it. There’s an easy way to fetch your previously executed commands instead of retyping them: you can simply press arrow up (↑) once or multiple times. To print a full list of recent commands, use history command.

Try it in your terminal!

2.2.3. Working with files#

Several commands that apply to working with directories also apply to files. Let’s take a look at what the following commands mean:

  • cp a.txt b.txt - copies a.txt to b.txt in the same directory. Using mv instead of cp would rename a.txt into b.txt.

  • cp a.txt ../ - copies a.txt to one directory up (it can also be used with mv to move the file).

  • cp a.txt A/ - as previous command, but copies a.txt in the directory A/ (can also be used with mv).

  • cp ../a.txt . - copies a.txt from one directory up to the current (.) directory (it can also be used with mv).

2.2.3.1. Wildcard#

Sometimes you will want to copy or move mutiple files or directories at the same time. To avoid typing each command individually or recalling the same command and changing it multiple times, you can use the wildcard * to replace any text.

For instance, let’s say we are located in the directory Physics:

../../_images/wildcard.png

Fig. 2.3 Example folder: wildcard usage.#

If we are in the directory Physics and want to move all Notes files into directory Materials/, we could use mv Notes* Materials/. With Notes*, we included all three .docx files. Therefore, * effectively means Nov21.docx or Nov24.docx or Oct16.docx.

We could alternatively use mv N* Materials/ because our three files with notes are the only files beginning with letter N, so mv N* already defines our selection. Another option would be to use mv *docx Materials/ because Notes are the only .docx files in the directory Physics/.

Note that it’s also possible to use multiple wildcards in one go if there are several patterns you wish to generalize. E.g., to delete all .docx files that have Nov in their name, you can use rm *Nov*.docx.

import micropip
await micropip.install("jupyterquiz")
from jupyterquiz import display_quiz
import json

with open("question2.json", "r") as file:
    questions=json.load(file)
    
display_quiz(questions, border_radius=0)

2.2.3.2. Reading files#

For taking a glance at the contents of a text file in read-only mode, less comes in very handy. To open a file for reading, we use less file.txt. We can further navigate through the text of a file by scrolling or search for specific text patterns like this: /Pattern (note that this is case sensitive, i.e., there is a difference between /Pattern and /pattern). To navigate to the end of the file, use g. To move to the beginning of the file, use G. To close the file, simply press q (for “quit”) on your keyboard.

An alternative command used to read the contents of a file is cat. Unlike the less command which opens a file, cat prints a file’s contents to your terminal. If you use it with more than one file, e.g., cat fileA.txt fileB.txt, it will concatenate the files and print the output in the terminal.

2.2.3.3. Editing files with Vim#

Vim is a powerful text editor which you can use from within the terminal. To open a file for editing, you can simply type vim file.txt. If a file with the given name doesn’t exist, Vim will create a new empty file carrying that name.

Unlike text editors such as Notepad or MS Word, Vim is entirely command-based. That means that even simply writing some new text in the file requires extra steps instead of just starting to type (concretely, you have to press i to let Vim know that you wish to type new text). Upside: you can’t accidentally add new text, which is actually quite useful when working with scripts. Vim does take some getting used to, but is ultimately a powerful text editor and usually comes pre-installed (e.g., when you remotely connect to a supercomputing cluster such as DelftBlue).

Table 2.2 Basic Vim commands. More commands can be found online.#

Command

Effect

Details

i

Insert text

Esc

Escape current mode

If we’re in insert mode with i, this brings us back to mode where no text input can be written.

u

Undo

dd

Delete

Delete current line. To delete characters, you can go in the i mode. To delete everything from the current line (cursor position) to the end of file, use dG.

x

Delete a character

Deletes a character at the position of the cursor.

yy, p

Copy-paste

yy copies a line, while p pastes it below the current line. To paste above, use P.

:%s/old/new/gc

Replace

Replaces old pattern with new. c allows you to decide manually for each old whether it should be changed to new or not. Using only g replaces all occurences of old with new.

/

Pattern search

/pattern brings the cursor to the specified pattern in text.

n

Next

Pressing n (repeatedly) after the pattern search with / takes cursor to the next occurence of the pattern.

N

Previous

Opposite of n.

gg and 0

Beginning

gg brings the cursor to the beginning of file, 0 to the beginning of line.

G and $

End

G brings the cursor to the end of file, $ to the end of line.

h, j, k,l

Move cursor

Moves cursor one position left/down/up/right.

:set nu

Line numbers

Turns on line numbering.

v, V

Visual mode

For identifying pieces of text to be manipulated. See more here.

q

Function

Allows for defining custom functions.

:w

Write changes

Save made changes in the file.

:q

Close file

:q! closes file without saving the made changes. It can be used together with w as :wq, which saves all changes and closes the file in one go.