From 628438e314c15b3117a77937c89fcf840ff14b3e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 29 Jan 2024 15:59:31 +0000 Subject: [PATCH] markdown source builds Auto-generated via {sandpaper} Source : f77a982913e8d8fcdb0000bad49550046f8e2744 Branch : main Author : Neil Shephard Time : 2024-01-29 15:58:27 +0000 Message : Merge pull request #11 from AFM-SPM/ns-rse/2-unix-shell-intro --- 01-command-line.md | 167 ++ 02-filedir.md | 818 ++++++++++ 03-create.md | 1764 ++++++++++++++++++++++ config.yaml | 5 +- fig/filesystem-challenge.odg | Bin 0 -> 9835 bytes fig/filesystem-challenge.svg | 763 ++++++++++ fig/filesystem.svg | 286 ++++ fig/find-file-tree.odg | Bin 0 -> 12197 bytes fig/find-file-tree.svg | 792 ++++++++++ fig/home-directories.svg | 518 +++++++ fig/homedir.odg | Bin 0 -> 11826 bytes fig/nano-screenshot.png | Bin 0 -> 42241 bytes fig/redirects-and-pipes.svg | 71 + fig/shell_command_syntax.svg | 47 + fig/shell_script_for_loop_flow_chart.svg | 913 +++++++++++ fig/standard-filesystem-hierarchy.svg | 1534 +++++++++++++++++++ introduction.md | 114 -- md5sum.txt | 8 +- reference.md | 69 +- 19 files changed, 7750 insertions(+), 119 deletions(-) create mode 100644 01-command-line.md create mode 100644 02-filedir.md create mode 100644 03-create.md create mode 100644 fig/filesystem-challenge.odg create mode 100644 fig/filesystem-challenge.svg create mode 100644 fig/filesystem.svg create mode 100644 fig/find-file-tree.odg create mode 100644 fig/find-file-tree.svg create mode 100644 fig/home-directories.svg create mode 100644 fig/homedir.odg create mode 100644 fig/nano-screenshot.png create mode 100644 fig/redirects-and-pipes.svg create mode 100644 fig/shell_command_syntax.svg create mode 100644 fig/shell_script_for_loop_flow_chart.svg create mode 100644 fig/standard-filesystem-hierarchy.svg delete mode 100644 introduction.md diff --git a/01-command-line.md b/01-command-line.md new file mode 100644 index 0000000..64a7a8e --- /dev/null +++ b/01-command-line.md @@ -0,0 +1,167 @@ +--- +title: "Introducing the Command Line" +teaching: 20 +exercises: 3 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- What is a command shell and why would I use one? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Explain when and why command-line interfaces should be used instead of graphical interfaces. + +:::::::::::::::::::::::::::::::::::::::::::::::: + +### Background + +Humans and computers commonly interact in many different ways, such as through a keyboard and mouse, touch screen +interfaces, or using speech recognition systems. The most widely used way to interact with personal computers is called +a **graphical user interface** (GUI). With a GUI, we give instructions by clicking a mouse and using menu-driven +interactions. + +While the visual aid of a GUI makes it intuitive to learn, this way of delivering instructions to a computer scales very +poorly. Imagine the following task: for a literature search, you have to copy the third line of one thousand text files +in one thousand different directories and paste it into a single file. Using a GUI, you would not only be clicking at +your desk for several hours, but you could potentially also commit an error in the process of completing this repetitive +task. This is where we take advantage of the Unix shell. The Unix shell is both a **command-line interface** (CLI) and +a scripting language, allowing such repetitive tasks to be done automatically and fast. With the proper commands, the +shell can repeat tasks with or without some modification as many times as we want. Using the shell, the task in the +literature example can be accomplished in seconds. + +### The Shell + +The shell is a program where users can type commands. With the shell, it's possible to invoke complicated programs like +climate modeling software or simple commands that create an empty directory with only one line of code. The most popular +Unix shell is Bash (the Bourne Again SHell --- so-called because it's derived from a shell written by Stephen +Bourne). Bash is the default shell on most modern implementations of Unix and in most packages that provide Unix-like +tools for Windows. Note that 'Git Bash' is a piece of software that enables Windows users to use a Bash like interface +when interacting with Git. + +Using the shell will take some effort and some time to learn. While a GUI presents you with choices to select, CLI +choices are not automatically presented to you, so you must learn a few commands like new vocabulary in a language +you're studying. However, unlike a spoken language, a small number of "words" (i.e. commands) gets you a long way, and +we'll cover those essential few today. + +The grammar of a shell allows you to combine existing tools into powerful pipelines and handle large volumes of data +automatically. Sequences of commands can be written into a *script*, improving the reproducibility of workflows. + +In addition, the command line is often the easiest way to interact with remote machines and supercomputers. Familiarity +with the shell is near essential to run a variety of specialized tools and resources including high-performance +computing systems. As clusters and cloud computing systems become more popular for scientific data crunching, being able +to interact with the shell is becoming a necessary skill. We can build on the command-line skills covered here to tackle +a wide range of scientific questions and computational challenges. + +Let's get started. + +When the shell is first opened, you are presented with a **prompt**, indicating that the shell is waiting for input. + +```bash +$ +``` + +The shell typically uses `$ ` as the prompt, but may use a different symbol. In the examples for this lesson, we'll +show the prompt as `$ `. Most importantly, *do not type the prompt* when typing commands. Only type the command that +follows the prompt. This rule applies both in these lessons and in lessons from other sources. Also note that after +you type a command, you have to press the Enter key to execute it. + +The prompt is followed by a **text cursor**, a character that indicates the position where your typing will appear. The +cursor is usually a flashing or solid block, but it can also be an underscore or a pipe. You may have seen it in a text +editor program, for example. + +Note that your prompt might look a little different. In particular, most popular shell environments by default put your +user name and the host name before the `$`. Such a prompt might look like, e.g.: + +```bash +nelle@localhost $ +``` + +The prompt might even include more than this. Do not worry if your prompt is not just a short `$ `. This lesson does not +depend on this additional information and it should also not get in your way. The only important item to focus on is the +`$ ` character itself and we will see later why. + +So let's try our first command, `ls`, which is short for listing. This command will list the contents of the current +directory: + +```bash +$ ls +``` + +```output +Desktop Downloads Movies Pictures +Documents Library Music Public +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Command not found + +If the shell can't find a program whose name is the command you typed, it will print an error message such as: + +```bash +$ ks +``` + +```output +ks: command not found +``` + +This might happen if the command was mis-typed or if the program corresponding to that command is not installed. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## Nelle's Pipeline: A Typical Problem + +Nelle Nemo, a marine biologist, has just returned from a six-month survey of the [North Pacific +Gyre](https://en.wikipedia.org/wiki/North_Pacific_Gyre), where she has been sampling gelatinous marine life in the +[Great Pacific Garbage Patch](https://en.wikipedia.org/wiki/Great_Pacific_Garbage_Patch). She has 1520 samples that +she's run through an assay machine to measure the relative abundance of 300 proteins. She needs to run these 1520 files +through an imaginary program called `goostats.sh`. In addition to this huge task, she has to write up results by the +end of the month, so her paper can appear in a special issue of *Aquatic Goo Letters*. + +If Nelle chooses to run `goostats.sh` by hand using a GUI, she'll have to select and open a file 1520 times. If +`goostats.sh` takes 30 seconds to run each file, the whole process will take more than 12 hours of Nelle's attention. +With the shell, Nelle can instead assign her computer this mundane task while she focuses her attention on writing her +paper. + +The next few lessons will explore the ways Nelle can achieve this. More specifically, the lessons explain how she can +use a command shell to run the `goostats.sh` program, using loops to automate the repetitive steps of entering file +names, so that her computer can work while she writes her paper. + +As a bonus, once she has put a processing pipeline together, she will be able to use it again whenever she collects more +data. + +In order to achieve her task, Nelle needs to know how to: + +- navigate to a file/directory +- create a file/directory +- check the length of a file +- chain commands together +- retrieve a set of files +- iterate over files +- run a shell script containing her pipeline + + + +:::::::::::::::::::::::::::::::::::::::: keypoints + +- A shell is a program whose primary purpose is to read commands and run other programs. +- This lesson uses Bash, the default shell in many implementations of Unix. +- Programs can be run in Bash by entering commands at the command-line prompt. +- The shell's main advantages are its high action-to-keystroke ratio, its support for automating repetitive tasks, and + its capacity to access networked machines. +- A significant challenge when using the shell can be knowing what commands need to be run and how to run them. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + + +This chapter is from "[Software Carpentry The Unix Shell][swcarpentry-unix]". It is licensed under the +[CC-BY-4.0][cc-by-4]. + + +[swcarpentry-unix]: https://swcarpentry.github.io/shell-novice/ +[cc-by-4]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/02-filedir.md b/02-filedir.md new file mode 100644 index 0000000..eeee737 --- /dev/null +++ b/02-filedir.md @@ -0,0 +1,818 @@ +--- +title: Navigating Files and Directories +teaching: 30 +exercises: 10 +--- + +::::::::::::::::::::::::::::::::::::::: objectives + +- Explain the similarities and differences between a file and a directory. +- Translate an absolute path into a relative path and vice versa. +- Construct absolute and relative paths that identify specific files and directories. +- Use options and arguments to change the behaviour of a shell command. +- Demonstrate the use of tab completion and explain its advantages. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: questions + +- How can I move around on my computer? +- How can I see what files and directories I have? +- How can I specify the location of a file or directory on my computer? + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: instructor + +Introducing and navigating the filesystem in the shell (covered in [Navigating Files and Directories](02-filedir.md) +section) can be confusing. You may have both terminal and GUI file explorer open side by side so learners can see the +content and file structure while they're using terminal to navigate the system. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +The part of the operating system responsible for managing files and directories is called the **file system**. It +organizes our data into files, which hold information, and directories (also called 'folders'), which hold files or +other directories. + +Several commands are frequently used to create, inspect, rename, and delete files and directories. To start exploring +them, we'll go to our open shell window. + +First, let's find out where we are by running a command called `pwd` (which stands for 'print working +directory'). Directories are like *places* — at any time while we are using the shell, we are in exactly one place +called our **current working directory**. Commands mostly read and write files in the current working directory, +i.e. 'here', so knowing where you are before running a command is important. `pwd` shows you where you are: + +```bash +$ pwd +``` + +```output +/Users/nelle +``` + +Here, the computer's response is `/Users/nelle`, which is Nelle's **home directory**: + +::::::::::::::::::::::::::::::::::::::::: callout + +## Home Directory Variation + +The home directory path will look different on different operating systems. On Linux, it may look like `/home/nelle`, +and on Windows, it will be similar to `C:\Documents and Settings\nelle` or `C:\Users\nelle`. (Note that it may look +slightly different for different versions of Windows.) In future examples, we've used Mac output as the default - Linux +and Windows output may differ slightly but should be generally similar. + +We will also assume that your `pwd` command returns your user's home directory. If `pwd` returns something different, +you may need to navigate there using `cd` or some commands in this lesson will not work as written. See [Exploring +Other Directories](#exploring-other-directories) for more details on the `cd` command. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +To understand what a 'home directory' is, let's have a look at how the file system as a whole is organized. For the +sake of this example, we'll be illustrating the filesystem on our scientist Nelle's computer. After this illustration, +you'll be learning commands to explore your own filesystem, which will be constructed in a similar way, but not be +exactly identical. + +On Nelle's computer, the filesystem looks like this: + +![](fig/filesystem.svg){alt='The file system is made up of a root directory that contains sub-directories titled bin, +data, users, and tmp'} + +The filesystem looks like an upside down tree. The topmost directory is the **root directory** that holds everything +else. We refer to it using a slash character, `/`, on its own; this character is the leading slash in `/Users/nelle`. + +Inside that directory are several other directories: `bin` (which is where some built-in programs are stored), `data` +(for miscellaneous data files), `Users` (where users' personal directories are located), `tmp` (for temporary files that +don't need to be stored long-term), and so on. + +We know that our current working directory `/Users/nelle` is stored inside `/Users` because `/Users` is the first part +of its name. Similarly, we know that `/Users` is stored inside the root directory `/` because its name begins with `/`. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Slashes + +Notice that there are two meanings for the `/` character. When it appears at the front of a file or directory name, it +refers to the root directory. When it appears *inside* a path, it's just a separator. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +Underneath `/Users`, we find one directory for each user with an account on Nelle's machine, her colleagues *imhotep* +and *larry*. + +![](fig/home-directories.svg){alt='Like other directories, home directories are sub-directories underneath "/Users" like +"/Users/imhotep", "/Users/larry" or"/Users/nelle"'} + +The user *imhotep*'s files are stored in `/Users/imhotep`, user *larry*'s in `/Users/larry`, and Nelle's in +`/Users/nelle`. Nelle is the user in our examples here; therefore, we get `/Users/nelle` as our home directory. +Typically, when you open a new command prompt, you will be in your home directory to start. + +Now let's learn the command that will let us see the contents of our own filesystem. We can see what's in our home +directory by running `ls`: + +```bash +$ ls +``` + +```output +Applications Documents Library Music Public +Desktop Downloads Movies Pictures +``` + +(Again, your results may be slightly different depending on your operating system and how you have customized your +filesystem.) + +`ls` prints the names of the files and directories in the current directory. We can make its output more comprehensible +by using the `-F` **option** which tells `ls` to classify the output by adding a marker to file and directory names to +indicate what they are: + +- a trailing `/` indicates that this is a directory +- `@` indicates a link +- `*` indicates an executable + +Depending on your shell's default settings, the shell might also use colors to indicate whether each entry is a file or +directory. + +```bash +$ ls -F +``` + +```output +Applications/ Documents/ Library/ Music/ Public/ +Desktop/ Downloads/ Movies/ Pictures/ +``` + +Here, we can see that the home directory contains only **sub-directories**. Any names in the output that don't have a +classification symbol are **files** in the current working directory. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Clearing your terminal + +If your screen gets too cluttered, you can clear your terminal using the `clear` command. You can still access previous +commands using and to move line-by-line, or by scrolling in your terminal. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Getting help + +`ls` has lots of other **options**. There are two common ways to find out how to use a command and what options it +accepts --- **depending on your environment, you might find that only one of these ways works:** + +1. We can pass a `--help` option to any command (available on Linux and Git Bash), for example: + + ```bash + $ ls --help + ``` + +2. We can read its manual with `man` (available on Linux and macOS): + + ```bash + $ man ls + ``` + +We'll describe both ways next. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Help for built-in commands + +Some commands are built in to the Bash shell, rather than existing as separate programs on the filesystem. One example +is the `cd` (change directory) command. If you get a message like `No manual entry for cd`, try `help cd` instead. The +`help` command is how you get usage information for [Bash +built-ins](https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html). + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +#### The `--help` option + +Most bash commands and programs that people have written to be run from within bash, support a `--help` option that +displays more information on how to use the command or program. + +```bash +$ ls --help +``` + +```output +Usage: ls [OPTION]... [FILE]... +List information about the FILEs (the current directory by default). +Sort entries alphabetically if neither -cftuvSUX nor --sort is specified. + +Mandatory arguments to long options are mandatory for short options, too. + -a, --all do not ignore entries starting with . + -A, --almost-all do not list implied . and .. + --author with -l, print the author of each file + -b, --escape print C-style escapes for nongraphic characters + --block-size=SIZE scale sizes by SIZE before printing them; e.g., + '--block-size=M' prints sizes in units of + 1,048,576 bytes; see SIZE format below + -B, --ignore-backups do not list implied entries ending with ~ + -c with -lt: sort by, and show, ctime (time of last + modification of file status information); + with -l: show ctime and sort by name; + otherwise: sort by ctime, newest first + -C list entries by columns + --color[=WHEN] colorize the output; WHEN can be 'always' (default + if omitted), 'auto', or 'never'; more info below + -d, --directory list directories themselves, not their contents + -D, --dired generate output designed for Emacs' dired mode + -f do not sort, enable -aU, disable -ls --color + -F, --classify append indicator (one of */=>@|) to entries +... ... ... +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Unsupported command-line options + +If you try to use an option that is not supported, `ls` and other commands will usually print an error message similar +to: + +```bash +$ ls -j +``` + +```error +ls: invalid option -- 'j' +Try 'ls --help' for more information. +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +#### The `man` command + +The other way to learn about `ls` is to type + +```bash +$ man ls +``` + +This command will turn your terminal into a page with a description of the `ls` command and its options. + +To navigate through the `man` pages, you may use and to move line-by-line, or try B +and Spacebar to skip up and down by a full page. To search for a character or word in the `man` pages, use +/ followed by the character or word you are searching for. Sometimes a search will result in multiple hits. +If so, you can move between hits using N (for moving forward) and Shift\+N (for moving +backward). + +To **quit** the `man` pages, press Q. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Manual pages on the web + +Of course, there is a third way to access help for commands: searching the internet via your web browser. When using +internet search, including the phrase `unix man page` in your search query will help to find relevant results. + +GNU provides links to its [manuals](https://www.gnu.org/manual/manual.html) including the [core GNU +utilities](https://www.gnu.org/software/coreutils/manual/coreutils.html), which covers many commands introduced within +this lesson. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Exploring More `ls` Options + +You can also use two options at the same time. What does the command `ls` do when used with the `-l` option? What about +if you use both the `-l` and the `-h` option? + +Some of its output is about properties that we do not cover in this lesson (such as file permissions and ownership), but +the rest should be useful nevertheless. + +::::::::::::::: solution + +## Solution + +The `-l` option makes `ls` use a **l**ong listing format, showing not only the file/directory names but also additional +information, such as the file size and the time of its last modification. If you use both the `-h` option and the `-l` +option, this makes the file size '**h**uman readable', i.e. displaying something like `5.3K` instead of `5369`. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Listing in Reverse Chronological Order + +By default, `ls` lists the contents of a directory in alphabetical order by name. The command `ls -t` lists items by +time of last change instead of alphabetically. The command `ls -r` lists the contents of a directory in reverse order. +Which file is displayed last when you combine the `-t` and `-r` options? Hint: You may need to use the `-l` option to +see the last changed dates. + +::::::::::::::: solution + +## Solution + +The most recently changed file is listed last when using `-rt`. This can be very useful for finding your most recent +edits or checking to see if a new output file was written. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Exploring Other Directories + +Not only can we use `ls` on the current working directory, but we can use it to list the contents of a different +directory. Let's take a look at our `Desktop` directory by running `ls -F Desktop`, i.e., the command `ls` with the +`-F` **option** and the [**argument**][Arguments] `Desktop`. The argument `Desktop` tells `ls` that we want a listing +of something other than our current working directory: + +```bash +$ ls -F Desktop +``` + +```output +shell-lesson-data/ +``` + +Note that if a directory named `Desktop` does not exist in your current working directory, this command will return an +error. Typically, a `Desktop` directory exists in your home directory, which we assume is the current working directory +of your bash shell. + +Your output should be a list of all the files and sub-directories in your Desktop directory, including the +`shell-lesson-data` directory you downloaded at the [setup for this lesson](../learners/setup.md). (On most systems, the +contents of the `Desktop` directory in the shell will show up as icons in a graphical user interface behind all the open +windows. See if this is the case for you.) + +Organizing things hierarchically helps us keep track of our work. While it's possible to put hundreds of files in our +home directory just as it's possible to pile hundreds of printed papers on our desk, it's much easier to find things +when they've been organized into sensibly-named subdirectories. + +Now that we know the `shell-lesson-data` directory is located in our Desktop directory, we can do two things. + +First, using the same strategy as before, we can look at its contents by passing a directory name to `ls`: + +```bash +$ ls -F Desktop/shell-lesson-data +``` + +```output +exercise-data/ north-pacific-gyre/ +``` + +Second, we can actually change our location to a different directory, so we are no longer located in our home directory. + +The command to change locations is `cd` followed by a directory name to change our working directory. `cd` stands for +'change directory', which is a bit misleading. The command doesn't change the directory; it changes the shell's current +working directory. In other words it changes the shell's settings for what directory we are in. The `cd` command is +akin to double-clicking a folder in a graphical interface to get into that folder. + +Let's say we want to move into the `exercise-data` directory we saw above. We can use the following series of commands +to get there: + +```bash +$ cd Desktop +$ cd shell-lesson-data +$ cd exercise-data +``` + +These commands will move us from our home directory into our Desktop directory, then into the `shell-lesson-data` +directory, then into the `exercise-data` directory. You will notice that `cd` doesn't print anything. This is normal. +Many shell commands will not output anything to the screen when successfully executed. But if we run `pwd` after it, we +can see that we are now in `/Users/nelle/Desktop/shell-lesson-data/exercise-data`. + +If we run `ls -F` without arguments now, it lists the contents of +`/Users/nelle/Desktop/shell-lesson-data/exercise-data`, because that's where we now are: + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data/exercise-data +``` + +```bash +$ ls -F +``` + +```output +alkanes/ animal-counts/ creatures/ numbers.txt writing/ +``` + +We now know how to go down the directory tree (i.e. how to go into a subdirectory), but how do we go up (i.e. how do we +leave a directory and go into its parent directory)? We might try the following: + +```bash +$ cd shell-lesson-data +``` + +```error +-bash: cd: shell-lesson-data: No such file or directory +``` + +But we get an error! Why is this? + +With our methods so far, `cd` can only see sub-directories inside your current directory. There are different ways to +see directories above your current location; we'll start with the simplest. + +There is a shortcut in the shell to move up one directory level. It works as follows: + +```bash +$ cd .. +``` + +`..` is a special directory name meaning "the directory containing this one", or more succinctly, the **parent** of the +current directory. Sure enough, if we run `pwd` after running `cd ..`, we're back in +`/Users/nelle/Desktop/shell-lesson-data`: + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data +``` + +The special directory `..` doesn't usually show up when we run `ls`. If we want to display it, we can add the `-a` +option to `ls -F`: + +```bash +$ ls -F -a +``` + +```output +./ ../ exercise-data/ north-pacific-gyre/ +``` + +`-a` stands for 'show all' (including hidden files); it forces `ls` to show us file and directory names that begin with +`.`, such as `..` (which, if we're in `/Users/nelle`, refers to the `/Users` directory). As you can see, it also +displays another special directory that's just called `.`, which means 'the current working directory'. It may seem +redundant to have a name for it, but we'll see some uses for it soon. + +Note that in most command line tools, multiple options can be combined with a single `-` and no spaces between the +options; `ls -F -a` is equivalent to `ls -Fa`. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Other Hidden Files + +In addition to the hidden directories `..` and `.`, you may also see a file called `.bash_profile`. This file usually +contains shell configuration settings. You may also see other files and directories beginning with `.`. These are +usually files and directories that are used to configure different programs on your computer. The prefix `.` is used to +prevent these configuration files from cluttering the terminal when a standard `ls` command is used. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +These three commands are the basic commands for navigating the filesystem on your computer: `pwd`, `ls`, and `cd`. Let's +explore some variations on those commands. What happens if you type `cd` on its own, without giving a directory? + +```bash +$ cd +``` + +How can you check what happened? `pwd` gives us the answer! + +```bash +$ pwd +``` + +```output +/Users/nelle +``` + +It turns out that `cd` without an argument will return you to your home directory, which is great if you've got lost in +your own filesystem. + +Let's try returning to the `exercise-data` directory from before. Last time, we used three commands, but we can actually +string together the list of directories to move to `exercise-data` in one step: + +```bash +$ cd Desktop/shell-lesson-data/exercise-data +``` + +Check that we've moved to the right place by running `pwd` and `ls -F`. + +If we want to move up one level from the data directory, we could use `cd ..`. But there is another way to move to any +directory, regardless of your current location. + +So far, when specifying directory names, or even a directory path (as above), we have been using **relative paths**. +When you use a relative path with a command like `ls` or `cd`, it tries to find that location from where we are, rather +than from the root of the file system. + +However, it is possible to specify the **absolute path** to a directory by including its entire path from the root +directory, which is indicated by a leading slash. The leading `/` tells the computer to follow the path from the root of +the file system, so it always refers to exactly one directory, no matter where we are when we run the command. + +This allows us to move to our `shell-lesson-data` directory from anywhere on the filesystem (including from inside +`exercise-data`). To find the absolute path we're looking for, we can use `pwd` and then extract the piece we need to +move to `shell-lesson-data`. + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data/exercise-data +``` + +```bash +$ cd /Users/nelle/Desktop/shell-lesson-data +``` + +Run `pwd` and `ls -F` to ensure that we're in the directory we expect. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Two More Shortcuts + +The shell interprets a tilde (`~`) character at the start of a path to mean "the current user's home directory". For +example, if Nelle's home directory is `/Users/nelle`, then `~/data` is equivalent to `/Users/nelle/data`. This only +works if it is the first character in the path; `here/there/~/elsewhere` is *not* `here/there/Users/nelle/elsewhere`. + +Another shortcut is the `-` (dash) character. `cd` will translate `-` into *the previous directory I was in*, which is +faster than having to remember, then type, the full path. This is a *very* efficient way of moving *back and forth +between two directories* -- i.e. if you execute `cd -` twice, you end up back in the starting directory. + +The difference between `cd ..` and `cd -` is that the former brings you *up*, while the latter brings you *back*. + +*** + +Try it! First navigate to `~/Desktop/shell-lesson-data` (you should already be there). + +```bash +$ cd ~/Desktop/shell-lesson-data +``` + +Then `cd` into the `exercise-data/creatures` directory + +```bash +$ cd exercise-data/creatures +``` + +Now if you run + +```bash +$ cd - +``` + +you'll see you're back in `~/Desktop/shell-lesson-data`. Run `cd -` again and you're back in +`~/Desktop/shell-lesson-data/exercise-data/creatures` + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Absolute vs Relative Paths + +Starting from `/Users/nelle/data`, which of the following commands could Nelle use to navigate to her home directory, +which is `/Users/nelle`? + +1. `cd .` +2. `cd /` +3. `cd /home/nelle` +4. `cd ../..` +5. `cd ~` +6. `cd home` +7. `cd ~/data/..` +8. `cd` +9. `cd ..` + +::::::::::::::: solution + +## Solution + +1. No: `.` stands for the current directory. +2. No: `/` stands for the root directory. +3. No: Nelle's home directory is `/Users/nelle`. +4. No: this command goes up two levels, i.e. ends in `/Users`. +5. Yes: `~` stands for the user's home directory, in this case `/Users/nelle`. +6. No: this command would navigate into a directory `home` in the current directory if it exists. +7. Yes: unnecessarily complicated, but correct. +8. Yes: shortcut to go back to the user's home directory. +9. Yes: goes up one level. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Relative Path Resolution + +Using the filesystem diagram below, if `pwd` displays `/Users/thing`, what will `ls -F ../backup` display? + +1. `../backup: No such file or directory` +2. `2012-12-01 2013-01-08 2013-01-27` +3. `2012-12-01/ 2013-01-08/ 2013-01-27/` +4. `original/ pnas_final/ pnas_sub/` + +![](fig/filesystem-challenge.svg){alt='A directory tree below the Users directory where "/Users" contains the +directories "backup" and "thing"; "/Users/backup" contains "original","pnas\_final" and "pnas\_sub"; "/Users/thing" +contains "backup"; and"/Users/thing/backup" contains "2012-12-01", "2013-01-08" and"2013-01-27"'} + +::::::::::::::: solution + +## Solution + +1. No: there *is* a directory `backup` in `/Users`. +2. No: this is the content of `Users/thing/backup`, but with `..`, we asked for one level further up. +3. No: see previous explanation. +4. Yes: `../backup/` refers to `/Users/backup/`. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## `ls` Reading Comprehension + +Using the filesystem diagram below, if `pwd` displays `/Users/backup`, and `-r` tells `ls` to display things in reverse +order, what command(s) will result in the following output: + +```output +pnas_sub/ pnas_final/ original/ +``` + +![](fig/filesystem-challenge.svg){alt='A directory tree below the Users directory where "/Users" contains the +directories "backup" and "thing"; "/Users/backup" contains "original","pnas\_final" and "pnas\_sub"; "/Users/thing" +contains "backup"; and"/Users/thing/backup" contains "2012-12-01", "2013-01-08" and"2013-01-27"'} + +1. `ls pwd` +2. `ls -r -F` +3. `ls -r -F /Users/backup` + +::::::::::::::: solution + +## Solution + +1. No: `pwd` is not the name of a directory. +2. Yes: `ls` without directory argument lists files and directories in the current directory. +3. Yes: uses the absolute path explicitly. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## General Syntax of a Shell Command + +We have now encountered commands, options, and arguments, but it is perhaps useful to formalise some terminology. + +Consider the command below as a general example of a command, which we will dissect into its component parts: + +```bash +$ ls -F / +``` + +![](fig/shell_command_syntax.svg){alt='General syntax of a shell command'} + +`ls` is the **command**, with an **option** `-F` and an **argument** `/`. We've already encountered options which +either start with a single dash (`-`), known as **short options**, or two dashes (`--`), known as **long options**. +[Options] change the behavior of a command and [Arguments] tell the command what to operate on (e.g. files and +directories). Sometimes options and arguments are referred to as **parameters**. A command can be called with more +than one option and more than one argument, but a command doesn't always require an argument or an option. + +You might sometimes see options being referred to as **switches** or **flags**, especially for options that take no +argument. In this lesson we will stick with using the term *option*. + +Each part is separated by spaces. If you omit the space between `ls` and `-F` the shell will look for a command called +`ls-F`, which doesn't exist. Also, capitalization can be important. For example, `ls -s` will display the size of files +and directories alongside the names, while `ls -S` will sort the files and directories by size, as shown below: + +```bash +$ cd ~/Desktop/shell-lesson-data +$ ls -s exercise-data +``` + +```output +total 28 + 4 animal-counts 4 creatures 12 numbers.txt 4 alkanes 4 writing +``` + +Note that the sizes returned by `ls -s` are in *blocks*. As these are defined differently for different operating +systems, you may not obtain the same figures as in the example. + +```bash +$ ls -S exercise-data +``` + +```output +animal-counts creatures alkanes writing numbers.txt +``` + +Putting all that together, our command `ls -F /` above gives us a listing of files and directories in the root directory +`/`. An example of the output you might get from the above command is given below: + +```bash +$ ls -F / +``` + +```output +Applications/ System/ +Library/ Users/ +Network/ Volumes/ +``` + + +::::::::::::::::::::::::::::::::::::::::: callout +### When to use short or long options +When options exist as both short and long options: + +- Use the short option when typing commands directly into the shell to minimize keystrokes and get your task done + faster. +- Use the long option in scripts to provide clarity. It will be read many times and typed once. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Nelle's Pipeline: Organizing Files + +Knowing this much about files and directories, Nelle is ready to organize the files that the protein assay machine will +create. + +She creates a directory called `north-pacific-gyre` (to remind herself where the data came from), which will contain the +data files from the assay machine and her data processing scripts. + +Each of her physical samples is labelled according to her lab's convention with a unique ten-character ID, such as +'NENE01729A'. This ID is what she used in her collection log to record the location, time, depth, and other +characteristics of the sample, so she decides to use it within the filename of each data file. Since the output of the +assay machine is plain text, she will call her files `NENE01729A.txt`, `NENE01812A.txt`, and so on. All 1520 files will +go into the same directory. + +Now in her current directory `shell-lesson-data`, Nelle can see what files she has using the command: + +```bash +$ ls north-pacific-gyre/ +``` + +This command is a lot to type, but she can let the shell do most of the work through what is called **tab completion**. +If she types: + +```bash +$ ls nor +``` + +and then presses Tab (the tab key on her keyboard), the shell automatically completes the directory name for +her: + +```bash +$ ls north-pacific-gyre/ +``` + +Pressing Tab again does nothing, since there are multiple possibilities; pressing Tab twice brings +up a list of all the files. + +If Nelle then presses G and then presses Tab again, the shell will append 'goo' since all files +that start with 'g' share the first three characters 'goo'. + +```bash +$ ls north-pacific-gyre/goo +``` + +To see all of those files, she can press Tab twice more. + +```bash +ls north-pacific-gyre/goo +goodiff.sh goostats.sh +``` + +This is called **tab completion**, and we will see it in many other tools as we go on. + + + +[Arguments]: https://swcarpentry.github.io/shell-novice/reference.html#argument + + +:::::::::::::::::::::::::::::::::::::::: keypoints + +- The file system is responsible for managing information on the disk. +- Information is stored in files, which are stored in directories (folders). +- Directories can also store other directories, which then form a directory tree. +- `pwd` prints the user's current working directory. +- `ls [path]` prints a listing of a specific file or directory; `ls` on its own lists the current working directory. +- `cd [path]` changes the current working directory. +- Most commands take options that begin with a single `-`. +- Directory names in a path are separated with `/` on Unix, but `\` on Windows. +- `/` on its own is the root directory of the whole file system. +- An absolute path specifies a location from the root of the file system. +- A relative path specifies a location starting from the current location. +- `.` on its own means 'the current directory'; `..` means 'the directory above the current one'. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + + + +This chapter is from "[Software Carpentry The Unix Shell][swcarpentry-unix]". It is licensed under the +[CC-BY-4.0][cc-by-4]. + + +[swcarpentry-unix]: https://swcarpentry.github.io/shell-novice/ +[cc-by-4]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/03-create.md b/03-create.md new file mode 100644 index 0000000..081eb10 --- /dev/null +++ b/03-create.md @@ -0,0 +1,1764 @@ +--- +title: Working With Files and Directories +teaching: 30 +exercises: 20 +--- + +::::::::::::::::::::::::::::::::::::::: objectives + +- Create a directory hierarchy that matches a given diagram. +- Create files in that hierarchy using an editor or by copying and renaming existing files. +- Delete, copy and move specified files and/or directories. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: questions + +- How can I create, copy, and delete files and directories? +- How can I edit files? + +:::::::::::::::::::::::::::::::::::::::::::::::::: + + +## Creating directories + +We now know how to explore files and directories, but how do we create them in the first place? + +In this episode we will learn about creating and moving files and directories, using the `exercise-data/writing` +directory as an example. + +### Step one: see where we are and what we already have + +We should still be in the `shell-lesson-data` directory on the Desktop, which we can check using: + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data +``` + +Next we'll move to the `exercise-data/writing` directory and see what it contains: + +```bash +$ cd exercise-data/writing/ +$ ls -F +``` + +```output +haiku.txt LittleWomen.txt +``` + +### Create a directory + +Let's create a new directory called `thesis` using the command `mkdir thesis` (which has no output): + +```bash +$ mkdir thesis +``` + +As you might guess from its name, `mkdir` means 'make directory'. Since `thesis` is a relative path (i.e., does not +have a leading slash, like `/what/ever/thesis`), the new directory is created in the current working directory: + +```bash +$ ls -F +``` + +```output +haiku.txt LittleWomen.txt thesis/ +``` + +Since we've just created the `thesis` directory, there's nothing in it yet: + +```bash +$ ls -F thesis +``` + +Note that `mkdir` is not limited to creating single directories one at a time. The `-p` option allows `mkdir` to create +a directory with nested subdirectories in a single operation: + +```bash +$ mkdir -p ../project/data ../project/results +``` + +The `-R` option to the `ls` command will list all nested subdirectories within a directory. Let's use `ls -FR` to +recursively list the new directory hierarchy we just created in the `project` directory: + +```bash +$ ls -FR ../project +``` + +```output +../project/: +data/ results/ + +../project/data: + +../project/results: +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Two ways of doing the same thing + +Using the shell to create a directory is no different than using a file explorer. If you open the current directory +using your operating system's graphical file explorer, the `thesis` directory will appear there too. While the shell +and the file explorer are two different ways of interacting with the files, the files and directories themselves are the +same. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::: callout + +## Good names for files and directories + +Complicated names of files and directories can make your life painful when working on the command line. Here we provide +a few useful tips for the names of your files and directories. + +1. Don't use spaces. + +Spaces can make a name more meaningful, but since spaces are used to separate arguments on the command line it is better +to avoid them in names of files and directories. You can use `-` or `_` instead (e.g. `north-pacific-gyre/` rather than +`north pacific gyre/`). To test this out, try typing `mkdir north pacific gyre` and see what directory (or +directories!) are made when you check with `ls -F`. + +2. Don't begin the name with `-` (dash). + +Commands treat names starting with `-` as options. + +3. Stick with letters, numbers, `.` (period or 'full stop'), `-` (dash) and `_` (underscore). + +Many other characters have special meanings on the command line. We will learn about some of these during this lesson. +There are special characters that can cause your command to not work as expected and can even result in data loss. + +If you need to refer to names of files or directories that have spaces or other special characters, you should surround +the name in quotes (`""`). + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::: instructor + +Learners can sometimes get trapped within command-line text editors such as Vim, Emacs, or Nano. Closing the terminal +emulator and opening a new one can be frustrating as learners will have to navigate to the correct folder again. Our +recommendation to mitigate this problem is that instructors should use the same text editor as the learners during +workshops (in most cases Nano). + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Create a text file + +Let's change our working directory to `thesis` using `cd`, then run a text editor called Nano to create a file called +`draft.txt`: + +```bash +$ cd thesis +$ nano draft.txt +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Which Editor? + +When we say, '`nano` is a text editor' we really do mean 'text'. It can only work with plain character data, not tables, +images, or any other human-friendly media. We use it in examples because it is one of the least complex text +editors. However, because of this trait, it may not be powerful enough or flexible enough for the work you need to do +after this workshop. On Unix systems (such as Linux and macOS), many programmers use +[Emacs](https://www.gnu.org/software/emacs/) or [Vim](https://www.vim.org/) (both of which require more time to learn), +or a graphical editor such as [Gedit](https://projects.gnome.org/gedit/) or [VScode](https://code.visualstudio.com/). On +Windows, you may wish to use [Notepad++](https://notepad-plus-plus.org/). Windows also has a built-in editor called +`notepad` that can be run from the command line in the same way as `nano` for the purposes of this lesson. + +No matter what editor you use, you will need to know where it searches for and saves files. If you start it from the +shell, it will (probably) use your current working directory as its default location. If you use your computer's start +menu, it may want to save files in your Desktop or Documents directory instead. You can change this by navigating to +another directory the first time you 'Save As...' + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +Let's type in a few lines of text. + +![](fig/nano-screenshot.png){alt="screenshot of nano text editor in action with the text It's not publish or perish any +more, it's share and thrive"} + +Once we're happy with our text, we can press Ctrl\+O (press the Ctrl or +Control key and, while holding it down, press the O key) to write our data to disk. We will be +asked to provide a name for the file that will contain our text. Press Return to accept the suggested default +of `draft.txt`. + +Once our file is saved, we can use Ctrl\+X to quit the editor and return to the shell. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Control, Ctrl, or ^ Key + +The Control key is also called the 'Ctrl' key. There are various ways in which using the Control key may be +described. For example, you may see an instruction to press the Control key and, while holding it down, press +the X key, described as any of: + +- `Control-X` +- `Control+X` +- `Ctrl-X` +- `Ctrl+X` +- `^X` +- `C-x` + +In nano, along the bottom of the screen you'll see `^G Get Help ^O WriteOut`. This means that you can use `Control-G` +to get help and `Control-O` to save your file. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +`nano` doesn't leave any output on the screen after it exits, but `ls` now shows that we have created a file called +`draft.txt`: + +```bash +$ ls +``` + +```output +draft.txt +``` + +::::::::::::::::::::::::::::::::::::::: challenge + +## Creating Files a Different Way + +We have seen how to create text files using the `nano` editor. Now, try the following command: + +```bash +$ touch my_file.txt +``` + +1. What did the `touch` command do? When you look at your current directory using the GUI file explorer, does the file + show up? + +2. Use `ls -l` to inspect the files. How large is `my_file.txt`? + +3. When might you want to create a file this way? + +::::::::::::::: solution + +## Solution + +1. The `touch` command generates a new file called `my_file.txt` in your current directory. You can observe this newly + generated file by typing `ls` at the command line prompt. `my_file.txt` can also be viewed in your GUI file explorer. + +2. When you inspect the file with `ls -l`, note that the size of `my_file.txt` is 0 bytes. In other words, it contains + no data. If you open `my_file.txt` using your text editor it is blank. + +3. Some programs do not generate output files themselves, but instead require that empty files have already been + generated. When the program is run, it searches for an existing file to populate with its output. The touch command + allows you to efficiently generate a blank text file to be used by such programs. + +::::::::::::::::::::::::: + +To avoid confusion later on, we suggest removing the file you've just created before proceeding with the rest of the +episode, otherwise future outputs may vary from those given in the lesson. To do this, use the following command: + +```bash +$ rm my_file.txt +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::: callout + +## What's In A Name? + +You may have noticed that all of Nelle's files are named 'something dot something', and in this part of the lesson, we +always used the extension `.txt`. This is just a convention; we can call a file `mythesis` or almost anything else we +want. However, most people use two-part names most of the time to help them (and their programs) tell different kinds of +files apart. The second part of such a name is called the **filename extension** and indicates what type of data the +file holds: `.txt` signals a plain text file, `.pdf` indicates a PDF document, `.cfg` is a configuration file full of +parameters for some program or other, `.png` is a PNG image, and so on. + +This is just a convention, albeit an important one. Files merely contain bytes; it's up to us and our programs to +interpret those bytes according to the rules for plain text files, PDF documents, configuration files, images, and so +on. + +Naming a PNG image of a whale as `whale.mp3` doesn't somehow magically turn it into a recording of whale song, though it +*might* cause the operating system to associate the file with a music player program. In this case, if someone +double-clicked `whale.mp3` in a file explorer program,the music player will automatically (and erroneously) attempt to +open the `whale.mp3` file. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## Moving files and directories + +Returning to the `shell-lesson-data/exercise-data/writing` directory, + +```bash +$ cd ~/Desktop/shell-lesson-data/exercise-data/writing +``` + +In our `thesis` directory we have a file `draft.txt` which isn't a particularly informative name, so let's change the +file's name using `mv`, which is short for 'move': + +```bash +$ mv thesis/draft.txt thesis/quotes.txt +``` + +The first argument tells `mv` what we're 'moving', while the second is where it's to go. In this case, we're moving +`thesis/draft.txt` to `thesis/quotes.txt`, which has the same effect as renaming the file. Sure enough, `ls` shows us +that `thesis` now contains one file called `quotes.txt`: + +```bash +$ ls thesis +``` + +```output +quotes.txt +``` + +One must be careful when specifying the target file name, since `mv` will silently overwrite any existing file with the +same name, which could lead to data loss. By default, `mv` will not ask for confirmation before overwriting files. +However, an additional option, `mv -i` (or `mv --interactive`), will cause `mv` to request such confirmation. + +Note that `mv` also works on directories. + +Let's move `quotes.txt` into the current working directory. We use `mv` once again, but this time we'll use just the +name of a directory as the second argument to tell `mv` that we want to keep the filename but put the file somewhere +new. (This is why the command is called 'move'.) In this case, the directory name we use is the special directory name +`.` that we mentioned earlier. + +```bash +$ mv thesis/quotes.txt . +``` + +The effect is to move the file from the directory it was in to the current working directory. `ls` now shows us that +`thesis` is empty: + +```bash +$ ls thesis +``` + +```output +$ +``` + +Alternatively, we can confirm the file `quotes.txt` is no longer present in the `thesis` directory by explicitly trying +to list it: + +```bash +$ ls thesis/quotes.txt +``` + +```error +ls: cannot access 'thesis/quotes.txt': No such file or directory +``` + +`ls` with a filename or directory as an argument only lists the requested file or directory. If the file given as the +argument doesn't exist, the shell returns an error as we saw above. We can use this to see that `quotes.txt` is now +present in our current directory: + +```bash +$ ls quotes.txt +``` + +```output +quotes.txt +``` + +::::::::::::::::::::::::::::::::::::::: challenge + +## Moving Files to a new folder + +After running the following commands, Jamie realizes that she put the files `sucrose.dat` and `maltose.dat` into the +wrong folder. The files should have been placed in the `raw` folder. + +```bash +$ ls -F + analyzed/ raw/ +$ ls -F analyzed +fructose.dat glucose.dat maltose.dat sucrose.dat +$ cd analyzed +``` + +Fill in the blanks to move these files to the `raw/` folder (i.e. the one she forgot to put them in) + +```bash +$ mv sucrose.dat maltose.dat ____/____ +``` + +::::::::::::::: solution + +## Solution + +```bash +$ mv sucrose.dat maltose.dat ../raw +``` + +Recall that `..` refers to the parent directory (i.e. one above the current directory) and that `.` refers to the +current directory. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## Copying files and directories + +The `cp` command works very much like `mv`, except it copies a file instead of moving it. We can check that it did the +right thing using `ls` with two paths as arguments --- like most Unix commands, `ls` can be given multiple paths at +once: + +```bash +$ cp quotes.txt thesis/quotations.txt +$ ls quotes.txt thesis/quotations.txt +``` + +```output +quotes.txt thesis/quotations.txt +``` + +We can also copy a directory and all its contents by using the [recursive](https://en.wikipedia.org/wiki/Recursion) +option `-r`, e.g. to back up a directory: + +```bash +$ cp -r thesis thesis_backup +``` + +We can check the result by listing the contents of both the `thesis` and `thesis_backup` directory: + +```bash +$ ls thesis thesis_backup +``` + +```output +thesis: +quotations.txt + +thesis_backup: +quotations.txt +``` + +It is important to include the `-r` flag. If you want to copy a directory and you omit this option you will see a +message that the directory has been omitted because `-r not specified`. + +``` bash +$ cp thesis thesis_backup +cp: -r not specified; omitting directory 'thesis' +``` + + +::::::::::::::::::::::::::::::::::::::: challenge + +## Renaming Files + +Suppose that you created a plain-text file in your current directory to contain a list of the statistical tests you will +need to do to analyze your data, and named it `statstics.txt` + +After creating and saving this file you realize you misspelled the filename! You want to correct the mistake, which of +the following commands could you use to do so? + +1. `cp statstics.txt statistics.txt` +2. `mv statstics.txt statistics.txt` +3. `mv statstics.txt .` +4. `cp statstics.txt .` + +::::::::::::::: solution + +## Solution + +1. No. While this would create a file with the correct name, the incorrectly named file still exists in the directory + and would need to be deleted. +2. Yes, this would work to rename the file. +3. No, the period(.) indicates where to move the file, but does not provide a new file name; identical file names cannot + be created. +4. No, the period(.) indicates where to copy the file, but does not provide a new file name; identical file names cannot + be created. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Moving and Copying + +What is the output of the closing `ls` command in the sequence shown below? + +```bash +$ pwd +``` + +```output +/Users/jamie/data +``` + +```bash +$ ls +``` + +```output +proteins.dat +``` + +```bash +$ mkdir recombined +$ mv proteins.dat recombined/ +$ cp recombined/proteins.dat ../proteins-saved.dat +$ ls +``` + +1. `proteins-saved.dat recombined` +2. `recombined` +3. `proteins.dat recombined` +4. `proteins-saved.dat` + +::::::::::::::: solution + +## Solution + +We start in the `/Users/jamie/data` directory, and create a new folder called `recombined`. The second line moves +(`mv`) the file `proteins.dat` to the new folder (`recombined`). The third line makes a copy of the file we just moved. +The tricky part here is where the file was copied to. Recall that `..` means 'go up a level', so the copied file is now +in `/Users/jamie`. Notice that `..` is interpreted with respect to the current working directory, **not** with respect +to the location of the file being copied. So, the only thing that will show using ls (in `/Users/jamie/data`) is the +recombined folder. + +1. No, see explanation above. `proteins-saved.dat` is located at `/Users/jamie` +2. Yes +3. No, see explanation above. `proteins.dat` is located at `/Users/jamie/data/recombined` +4. No, see explanation above. `proteins-saved.dat` is located at `/Users/jamie` + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## Removing files and directories + +Returning to the `shell-lesson-data/exercise-data/writing` directory, let's tidy up this directory by removing the +`quotes.txt` file we created. The Unix command we'll use for this is `rm` (short for 'remove'): + +```bash +$ rm quotes.txt +``` + +We can confirm the file has gone using `ls`: + +```bash +$ ls quotes.txt +``` + +```error +ls: cannot access 'quotes.txt': No such file or directory +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Deleting Is Forever + +The Unix shell doesn't have a trash bin that we can recover deleted files from (though most graphical interfaces to Unix +do). Instead, when we delete files, they are unlinked from the file system so that their storage space on disk can be +recycled. Tools for finding and recovering deleted files do exist, but there's no guarantee they'll work in any +particular situation, since the computer may recycle the file's disk space right away. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Using `rm` Safely + +What happens when we execute `rm -i thesis_backup/quotations.txt`? Why would we want this protection when using `rm`? + +::::::::::::::: solution + +## Solution + +```output +rm: remove regular file 'thesis_backup/quotations.txt'? y +``` + +The `-i` option will prompt before (every) removal (use Y to confirm deletion or N to keep the +file). The Unix shell doesn't have a trash bin, so all the files removed will disappear forever. By using the `-i` +option, we have the chance to check that we are deleting only the files that we want to remove. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +If we try to remove the `thesis` directory using `rm thesis`, we get an error message: + +```bash +$ rm thesis +``` + +```error +rm: cannot remove 'thesis': Is a directory +``` + +This happens because `rm` by default only works on files, not directories. + +`rm` can remove a directory *and all its contents* if we use the recursive option `-r`, and it will do so *without any +confirmation prompts*: + +```bash +$ rm -r thesis +``` + +Given that there is no way to retrieve files deleted using the shell, `rm -r` *should be used with great caution* (you +might consider adding the interactive option `rm -r -i`). + +## Operations with multiple files and directories + +Oftentimes one needs to copy or move several files at once. This can be done by providing a list of individual +filenames, or specifying a naming pattern using wildcards. Wildcards are special characters that can be used to +represent unknown characters or sets of characters when navigating the Unix file system. + +::::::::::::::::::::::::::::::::::::::: challenge + +## Copy with Multiple Filenames + +For this exercise, you can test the commands in the `shell-lesson-data/exercise-data` directory. + +In the example below, what does `cp` do when given several filenames and a directory name? + +```bash +$ mkdir backup +$ cp creatures/minotaur.dat creatures/unicorn.dat backup/ +``` + +In the example below, what does `cp` do when given three or more file names? + +```bash +$ cd creatures +$ ls -F +``` + +```output +basilisk.dat minotaur.dat unicorn.dat +``` + +```bash +$ cp minotaur.dat unicorn.dat basilisk.dat +``` + +::::::::::::::: solution + +## Solution + +If given more than one file name followed by a directory name (i.e. the destination directory must be the last +argument), `cp` copies the files to the named directory. + +If given three file names, `cp` throws an error such as the one below, because it is expecting a directory name as the +last argument. + +```error +cp: target 'basilisk.dat' is not a directory +``` + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Using wildcards for accessing multiple files at once + +::::::::::::::::::::::::::::::::::::::::: callout + +## Wildcards + +`*` is a **wildcard**, which represents zero or more other characters. Let's consider the +`shell-lesson-data/exercise-data/alkanes` directory: `*.pdb` represents `ethane.pdb`, `propane.pdb`, and every file that +ends with '.pdb'. On the other hand, `p*.pdb` only represents `pentane.pdb` and `propane.pdb`, because the 'p' at the +front can only represent filenames that begin with the letter 'p'. + +`?` is also a wildcard, but it represents exactly one character. So `?ethane.pdb` could represent `methane.pdb` whereas +`*ethane.pdb` represents both `ethane.pdb` and `methane.pdb`. + +Wildcards can be used in combination with each other. For example, `???ane.pdb` indicates three characters followed by +`ane.pdb`, giving `cubane.pdb ethane.pdb octane.pdb`. + +When the shell sees a wildcard, it expands the wildcard to create a list of matching filenames *before* running the +preceding command. As an exception, if a wildcard expression does not match any file, Bash will pass the expression as +an argument to the command as it is. For example, typing `ls *.pdf` in the `alkanes` directory (which contains only +files with names ending with `.pdb`) results in an error message that there is no file called `*.pdf`. However, +generally commands like `wc` and `ls` see the lists of file names matching these expressions, but not the wildcards +themselves. It is the shell, not the other programs, that expands the wildcards. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## List filenames matching a pattern + +When run in the `alkanes` directory, which `ls` command(s) will produce this output? + +`ethane.pdb methane.pdb` + +1. `ls *t*ane.pdb` +2. `ls *t?ne.*` +3. `ls *t??ne.pdb` +4. `ls ethane.*` + +::::::::::::::: solution + +## Solution + +The solution is `3.` + +`1.` shows all files whose names contain zero or more characters (`*`) followed by the letter `t`, then zero or more +characters (`*`) followed by `ane.pdb`. This gives `ethane.pdb methane.pdb octane.pdb pentane.pdb`. + +`2.` shows all files whose names start with zero or more characters (`*`) followed by the letter `t`, then a single +character (`?`), then `ne.` followed by zero or more characters (`*`). This will give us `octane.pdb` and `pentane.pdb` +but doesn't match anything which ends in `thane.pdb`. + +`3.` fixes the problems of option 2 by matching two characters (`??`) between `t` and `ne`. This is the solution. + +`4.` only shows files starting with `ethane.`. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## More on Wildcards + +Sam has a directory containing calibration data, datasets, and descriptions of the datasets: + +```bash +. +├── 2015-10-23-calibration.txt +├── 2015-10-23-dataset1.txt +├── 2015-10-23-dataset2.txt +├── 2015-10-23-dataset_overview.txt +├── 2015-10-26-calibration.txt +├── 2015-10-26-dataset1.txt +├── 2015-10-26-dataset2.txt +├── 2015-10-26-dataset_overview.txt +├── 2015-11-23-calibration.txt +├── 2015-11-23-dataset1.txt +├── 2015-11-23-dataset2.txt +├── 2015-11-23-dataset_overview.txt +├── backup +│   ├── calibration +│   └── datasets +└── send_to_bob + ├── all_datasets_created_on_a_23rd + └── all_november_files +``` + +Before heading off to another field trip, she wants to back up her data and send some datasets to her colleague Bob. Sam +uses the following commands to get the job done: + +```bash +$ cp *dataset* backup/datasets +$ cp ____calibration____ backup/calibration +$ cp 2015-____-____ send_to_bob/all_november_files/ +$ cp ____ send_to_bob/all_datasets_created_on_a_23rd/ +``` + +Help Sam by filling in the blanks. + +The resulting directory structure should look like this + +```bash +. +├── 2015-10-23-calibration.txt +├── 2015-10-23-dataset1.txt +├── 2015-10-23-dataset2.txt +├── 2015-10-23-dataset_overview.txt +├── 2015-10-26-calibration.txt +├── 2015-10-26-dataset1.txt +├── 2015-10-26-dataset2.txt +├── 2015-10-26-dataset_overview.txt +├── 2015-11-23-calibration.txt +├── 2015-11-23-dataset1.txt +├── 2015-11-23-dataset2.txt +├── 2015-11-23-dataset_overview.txt +├── backup +│   ├── calibration +│   │   ├── 2015-10-23-calibration.txt +│   │   ├── 2015-10-26-calibration.txt +│   │   └── 2015-11-23-calibration.txt +│   └── datasets +│   ├── 2015-10-23-dataset1.txt +│   ├── 2015-10-23-dataset2.txt +│   ├── 2015-10-23-dataset_overview.txt +│   ├── 2015-10-26-dataset1.txt +│   ├── 2015-10-26-dataset2.txt +│   ├── 2015-10-26-dataset_overview.txt +│   ├── 2015-11-23-dataset1.txt +│   ├── 2015-11-23-dataset2.txt +│   └── 2015-11-23-dataset_overview.txt +└── send_to_bob + ├── all_datasets_created_on_a_23rd + │   ├── 2015-10-23-dataset1.txt + │   ├── 2015-10-23-dataset2.txt + │   ├── 2015-10-23-dataset_overview.txt + │   ├── 2015-11-23-dataset1.txt + │   ├── 2015-11-23-dataset2.txt + │   └── 2015-11-23-dataset_overview.txt + └── all_november_files + ├── 2015-11-23-calibration.txt + ├── 2015-11-23-dataset1.txt + ├── 2015-11-23-dataset2.txt + └── 2015-11-23-dataset_overview.txt +``` + +::::::::::::::: solution + +## Solution + +```bash +$ cp *calibration.txt backup/calibration +$ cp 2015-11-* send_to_bob/all_november_files/ +$ cp *-23-dataset* send_to_bob/all_datasets_created_on_a_23rd/ +``` + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Organizing Directories and Files + +Jamie is working on a project, and she sees that her files aren't very well organized: + +```bash +$ ls -F +``` + +```output +analyzed/ fructose.dat raw/ sucrose.dat +``` + +The `fructose.dat` and `sucrose.dat` files contain output from her data analysis. What command(s) covered in this lesson +does she need to run so that the commands below will produce the output shown? + +```bash +$ ls -F +``` + +```output +analyzed/ raw/ +``` + +```bash +$ ls analyzed +``` + +```output +fructose.dat sucrose.dat +``` + +::::::::::::::: solution + +## Solution + +```bash +mv *.dat analyzed +``` + +Jamie needs to move her files `fructose.dat` and `sucrose.dat` to the `analyzed` directory. The shell will expand +\*.dat to match all .dat files in the current directory. The `mv` command then moves the list of .dat files to the +'analyzed' directory. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Reproduce a folder structure + +You're starting a new experiment and would like to duplicate the directory structure from your previous experiment so +you can add new data. + +Assume that the previous experiment is in a folder called `2016-05-18`, which contains a `data` folder that in turn +contains folders named `raw` and `processed` that contain data files. The goal is to copy the folder structure of the +`2016-05-18` folder into a folder called `2016-05-20` so that your final directory structure looks like this: + +```output +2016-05-20/ +└── data + ├── processed + └── raw +``` + +Which of the following set of commands would achieve this objective? What would the other commands do? + +```bash +$ mkdir 2016-05-20 +$ mkdir 2016-05-20/data +$ mkdir 2016-05-20/data/processed +$ mkdir 2016-05-20/data/raw +``` + +```bash +$ mkdir 2016-05-20 +$ cd 2016-05-20 +$ mkdir data +$ cd data +$ mkdir raw processed +``` + +```bash +$ mkdir 2016-05-20/data/raw +$ mkdir 2016-05-20/data/processed +``` + +```bash +$ mkdir -p 2016-05-20/data/raw +$ mkdir -p 2016-05-20/data/processed +``` + +```bash +$ mkdir 2016-05-20 +$ cd 2016-05-20 +$ mkdir data +$ mkdir raw processed +``` + +::::::::::::::: solution + +## Solution + +The first two sets of commands achieve this objective. The first set uses relative paths to create the top-level +directory before the subdirectories. + +The third set of commands will give an error because the default behavior of `mkdir` won't create a subdirectory of a +non-existent directory: the intermediate level folders must be created first. + +The fourth set of commands achieve this objective. Remember, the `-p` option, followed by a path of one or more +directories, will cause `mkdir` to create any intermediate subdirectories as required. + +The final set of commands generates the 'raw' and 'processed' directories at the same level as the 'data' directory. + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: keypoints + +- `cp [old] [new]` copies a file. +- `mkdir [path]` creates a new directory. +- `mv [old] [new]` moves (renames) a file or directory. +- `rm [path]` removes (deletes) a file. +- `*` matches zero or more characters in a filename, so `*.txt` matches all files ending in `.txt`. +- `?` matches any single character in a filename, so `?.txt` matches `a.txt` but not `any.txt`. +- Use of the Control key may be described in many ways, including `Ctrl-X`, `Control-X`, and `^X`. +- The shell does not have a trash bin: once something is deleted, it's really gone. +- Most files' names are `something.extension`. The extension isn't required, and doesn't guarantee anything, but is + normally used to indicate the type of data in the file. +- Depending on the type of work you do, you may need a more powerful text editor than Nano. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +title: Navigating Files and Directories teaching: 30 exercises: 10 +--- + +::::::::::::::::::::::::::::::::::::::: objectives + +- Explain the similarities and differences between a file and a directory. +- Translate an absolute path into a relative path and vice versa. +- Construct absolute and relative paths that identify specific files and directories. +- Use options and arguments to change the behaviour of a shell command. +- Demonstrate the use of tab completion and explain its advantages. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: questions + +- How can I move around on my computer? +- How can I see what files and directories I have? +- How can I specify the location of a file or directory on my computer? + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::: instructor + +Introducing and navigating the filesystem in the shell (covered in [Navigating Files and Directories](02-filedir.md) +section) can be confusing. You may have both terminal and GUI file explorer open side by side so learners can see the +content and file structure while they're using terminal to navigate the system. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +The part of the operating system responsible for managing files and directories is called the **file system**. It +organizes our data into files, which hold information, and directories (also called 'folders'), which hold files or +other directories. + +Several commands are frequently used to create, inspect, rename, and delete files and directories. To start exploring +them, we'll go to our open shell window. + +First, let's find out where we are by running a command called `pwd` (which stands for 'print working +directory'). Directories are like *places* — at any time while we are using the shell, we are in exactly one place +called our **current working directory**. Commands mostly read and write files in the current working directory, +i.e. 'here', so knowing where you are before running a command is important. `pwd` shows you where you are: + +```bash +$ pwd +``` + +```output +/Users/nelle +``` + +Here, the computer's response is `/Users/nelle`, which is Nelle's **home directory**: + +::::::::::::::::::::::::::::::::::::::::: callout + +## Home Directory Variation + +The home directory path will look different on different operating systems. On Linux, it may look like `/home/nelle`, +and on Windows, it will be similar to `C:\Documents and Settings\nelle` or `C:\Users\nelle`. (Note that it may look +slightly different for different versions of Windows.) In future examples, we've used Mac output as the default - Linux +and Windows output may differ slightly but should be generally similar. + +We will also assume that your `pwd` command returns your user's home directory. If `pwd` returns something different, +you may need to navigate there using `cd` or some commands in this lesson will not work as written. See [Exploring +Other Directories](#exploring-other-directories) for more details on the `cd` command. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +To understand what a 'home directory' is, let's have a look at how the file system as a whole is organized. For the +sake of this example, we'll be illustrating the filesystem on our scientist Nelle's computer. After this illustration, +you'll be learning commands to explore your own filesystem, which will be constructed in a similar way, but not be +exactly identical. + +On Nelle's computer, the filesystem looks like this: + +![](fig/filesystem.svg){alt='The file system is made up of a root directory that contains sub-directories titled bin, +data, users, and tmp'} + +The filesystem looks like an upside down tree. The topmost directory is the **root directory** that holds everything +else. We refer to it using a slash character, `/`, on its own; this character is the leading slash in `/Users/nelle`. + +Inside that directory are several other directories: `bin` (which is where some built-in programs are stored), `data` +(for miscellaneous data files), `Users` (where users' personal directories are located), `tmp` (for temporary files that +don't need to be stored long-term), and so on. + +We know that our current working directory `/Users/nelle` is stored inside `/Users` because `/Users` is the first part +of its name. Similarly, we know that `/Users` is stored inside the root directory `/` because its name begins with `/`. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Slashes + +Notice that there are two meanings for the `/` character. When it appears at the front of a file or directory name, it +refers to the root directory. When it appears *inside* a path, it's just a separator. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +Underneath `/Users`, we find one directory for each user with an account on Nelle's machine, her colleagues *imhotep* +and *larry*. + +![](fig/home-directories.svg){alt='Like other directories, home directories are sub-directories underneath "/Users" like +"/Users/imhotep", "/Users/larry" or"/Users/nelle"'} + +The user *imhotep*'s files are stored in `/Users/imhotep`, user *larry*'s in `/Users/larry`, and Nelle's in +`/Users/nelle`. Nelle is the user in our examples here; therefore, we get `/Users/nelle` as our home directory. +Typically, when you open a new command prompt, you will be in your home directory to start. + +Now let's learn the command that will let us see the contents of our own filesystem. We can see what's in our home +directory by running `ls`: + +```bash +$ ls +``` + +```output +Applications Documents Library Music Public +Desktop Downloads Movies Pictures +``` + +(Again, your results may be slightly different depending on your operating system and how you have customized your +filesystem.) + +`ls` prints the names of the files and directories in the current directory. We can make its output more comprehensible +by using the `-F` **option** which tells `ls` to classify the output by adding a marker to file and directory names to +indicate what they are: + +- a trailing `/` indicates that this is a directory +- `@` indicates a link +- `*` indicates an executable + +Depending on your shell's default settings, the shell might also use colors to indicate whether each entry is a file or +directory. + +```bash +$ ls -F +``` + +```output +Applications/ Documents/ Library/ Music/ Public/ +Desktop/ Downloads/ Movies/ Pictures/ +``` + +Here, we can see that the home directory contains only **sub-directories**. Any names in the output that don't have a +classification symbol are **files** in the current working directory. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Clearing your terminal + +If your screen gets too cluttered, you can clear your terminal using the `clear` command. You can still access previous +commands using and to move line-by-line, or by scrolling in your terminal. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Getting help + +`ls` has lots of other **options**. There are two common ways to find out how to use a command and what options it +accepts --- **depending on your environment, you might find that only one of these ways works:** + +1. We can pass a `--help` option to any command (available on Linux and Git Bash), for example: + + ```bash + $ ls --help + ``` + +2. We can read its manual with `man` (available on Linux and macOS): + + ```bash + $ man ls + ``` + +We'll describe both ways next. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Help for built-in commands + +Some commands are built in to the Bash shell, rather than existing as separate programs on the filesystem. One example +is the `cd` (change directory) command. If you get a message like `No manual entry for cd`, try `help cd` instead. The +`help` command is how you get usage information for [Bash +built-ins](https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html). + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +#### The `--help` option + +Most bash commands and programs that people have written to be run from within bash, support a `--help` option that +displays more information on how to use the command or program. + +```bash +$ ls --help +``` + +```output +Usage: ls [OPTION]... [FILE]... +List information about the FILEs (the current directory by default). +Sort entries alphabetically if neither -cftuvSUX nor --sort is specified. + +Mandatory arguments to long options are mandatory for short options, too. + -a, --all do not ignore entries starting with . + -A, --almost-all do not list implied . and .. + --author with -l, print the author of each file + -b, --escape print C-style escapes for nongraphic characters + --block-size=SIZE scale sizes by SIZE before printing them; e.g., + '--block-size=M' prints sizes in units of + 1,048,576 bytes; see SIZE format below + -B, --ignore-backups do not list implied entries ending with ~ + -c with -lt: sort by, and show, ctime (time of last + modification of file status information); + with -l: show ctime and sort by name; + otherwise: sort by ctime, newest first + -C list entries by columns + --color[=WHEN] colorize the output; WHEN can be 'always' (default + if omitted), 'auto', or 'never'; more info below + -d, --directory list directories themselves, not their contents + -D, --dired generate output designed for Emacs' dired mode + -f do not sort, enable -aU, disable -ls --color + -F, --classify append indicator (one of */=>@|) to entries +... ... ... +``` + +::::::::::::::::::::::::::::::::::::::::: callout + +## Unsupported command-line options + +If you try to use an option that is not supported, `ls` and other commands will usually print an error message similar +to: + +```bash +$ ls -j +``` + +```error +ls: invalid option -- 'j' +Try 'ls --help' for more information. +``` + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +#### The `man` command + +The other way to learn about `ls` is to type + +```bash +$ man ls +``` + +This command will turn your terminal into a page with a description of the `ls` command and its options. + +To navigate through the `man` pages, you may use and to move line-by-line, or try B +and Spacebar to skip up and down by a full page. To search for a character or word in the `man` pages, use +/ followed by the character or word you are searching for. Sometimes a search will result in multiple hits. +If so, you can move between hits using N (for moving forward) and Shift\+N (for moving +backward). + +To **quit** the `man` pages, press Q. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Manual pages on the web + +Of course, there is a third way to access help for commands: searching the internet via your web browser. When using +internet search, including the phrase `unix man page` in your search query will help to find relevant results. + +GNU provides links to its [manuals](https://www.gnu.org/manual/manual.html) including the [core GNU +utilities](https://www.gnu.org/software/coreutils/manual/coreutils.html), which covers many commands introduced within +this lesson. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Exploring More `ls` Options + +You can also use two options at the same time. What does the command `ls` do when used with the `-l` option? What about +if you use both the `-l` and the `-h` option? + +Some of its output is about properties that we do not cover in this lesson (such as file permissions and ownership), but +the rest should be useful nevertheless. + +::::::::::::::: solution + +## Solution + +The `-l` option makes `ls` use a **l**ong listing format, showing not only the file/directory names but also additional +information, such as the file size and the time of its last modification. If you use both the `-h` option and the `-l` +option, this makes the file size '**h**uman readable', i.e. displaying something like `5.3K` instead of `5369`. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Listing in Reverse Chronological Order + +By default, `ls` lists the contents of a directory in alphabetical order by name. The command `ls -t` lists items by +time of last change instead of alphabetically. The command `ls -r` lists the contents of a directory in reverse order. +Which file is displayed last when you combine the `-t` and `-r` options? Hint: You may need to use the `-l` option to +see the last changed dates. + +::::::::::::::: solution + +## Solution + +The most recently changed file is listed last when using `-rt`. This can be very useful for finding your most recent +edits or checking to see if a new output file was written. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Exploring Other Directories + +Not only can we use `ls` on the current working directory, but we can use it to list the contents of a different +directory. Let's take a look at our `Desktop` directory by running `ls -F Desktop`, i.e., the command `ls` with the +`-F` **option** and the [**argument**][Arguments] `Desktop`. The argument `Desktop` tells `ls` that we want a listing +of something other than our current working directory: + +```bash +$ ls -F Desktop +``` + +```output +shell-lesson-data/ +``` + +Note that if a directory named `Desktop` does not exist in your current working directory, this command will return an +error. Typically, a `Desktop` directory exists in your home directory, which we assume is the current working directory +of your bash shell. + +Your output should be a list of all the files and sub-directories in your Desktop directory, including the +`shell-lesson-data` directory you downloaded at the [setup for this lesson](../learners/setup.md). (On most systems, the +contents of the `Desktop` directory in the shell will show up as icons in a graphical user interface behind all the open +windows. See if this is the case for you.) + +Organizing things hierarchically helps us keep track of our work. While it's possible to put hundreds of files in our +home directory just as it's possible to pile hundreds of printed papers on our desk, it's much easier to find things +when they've been organized into sensibly-named subdirectories. + +Now that we know the `shell-lesson-data` directory is located in our Desktop directory, we can do two things. + +First, using the same strategy as before, we can look at its contents by passing a directory name to `ls`: + +```bash +$ ls -F Desktop/shell-lesson-data +``` + +```output +exercise-data/ north-pacific-gyre/ +``` + +Second, we can actually change our location to a different directory, so we are no longer located in our home directory. + +The command to change locations is `cd` followed by a directory name to change our working directory. `cd` stands for +'change directory', which is a bit misleading. The command doesn't change the directory; it changes the shell's current +working directory. In other words it changes the shell's settings for what directory we are in. The `cd` command is +akin to double-clicking a folder in a graphical interface to get into that folder. + +Let's say we want to move into the `exercise-data` directory we saw above. We can use the following series of commands +to get there: + +```bash +$ cd Desktop +$ cd shell-lesson-data +$ cd exercise-data +``` + +These commands will move us from our home directory into our Desktop directory, then into the `shell-lesson-data` +directory, then into the `exercise-data` directory. You will notice that `cd` doesn't print anything. This is normal. +Many shell commands will not output anything to the screen when successfully executed. But if we run `pwd` after it, we +can see that we are now in `/Users/nelle/Desktop/shell-lesson-data/exercise-data`. + +If we run `ls -F` without arguments now, it lists the contents of +`/Users/nelle/Desktop/shell-lesson-data/exercise-data`, because that's where we now are: + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data/exercise-data +``` + +```bash +$ ls -F +``` + +```output +alkanes/ animal-counts/ creatures/ numbers.txt writing/ +``` + +We now know how to go down the directory tree (i.e. how to go into a subdirectory), but how do we go up (i.e. how do we +leave a directory and go into its parent directory)? We might try the following: + +```bash +$ cd shell-lesson-data +``` + +```error +-bash: cd: shell-lesson-data: No such file or directory +``` + +But we get an error! Why is this? + +With our methods so far, `cd` can only see sub-directories inside your current directory. There are different ways to +see directories above your current location; we'll start with the simplest. + +There is a shortcut in the shell to move up one directory level. It works as follows: + +```bash +$ cd .. +``` + +`..` is a special directory name meaning "the directory containing this one", or more succinctly, the **parent** of the +current directory. Sure enough, if we run `pwd` after running `cd ..`, we're back in +`/Users/nelle/Desktop/shell-lesson-data`: + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data +``` + +The special directory `..` doesn't usually show up when we run `ls`. If we want to display it, we can add the `-a` +option to `ls -F`: + +```bash +$ ls -F -a +``` + +```output +./ ../ exercise-data/ north-pacific-gyre/ +``` + +`-a` stands for 'show all' (including hidden files); it forces `ls` to show us file and directory names that begin with +`.`, such as `..` (which, if we're in `/Users/nelle`, refers to the `/Users` directory). As you can see, it also +displays another special directory that's just called `.`, which means 'the current working directory'. It may seem +redundant to have a name for it, but we'll see some uses for it soon. + +Note that in most command line tools, multiple options can be combined with a single `-` and no spaces between the +options; `ls -F -a` is equivalent to `ls -Fa`. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Other Hidden Files + +In addition to the hidden directories `..` and `.`, you may also see a file called `.bash_profile`. This file usually +contains shell configuration settings. You may also see other files and directories beginning with `.`. These are +usually files and directories that are used to configure different programs on your computer. The prefix `.` is used to +prevent these configuration files from cluttering the terminal when a standard `ls` command is used. + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +These three commands are the basic commands for navigating the filesystem on your computer: `pwd`, `ls`, and `cd`. Let's +explore some variations on those commands. What happens if you type `cd` on its own, without giving a directory? + +```bash +$ cd +``` + +How can you check what happened? `pwd` gives us the answer! + +```bash +$ pwd +``` + +```output +/Users/nelle +``` + +It turns out that `cd` without an argument will return you to your home directory, which is great if you've got lost in +your own filesystem. + +Let's try returning to the `exercise-data` directory from before. Last time, we used three commands, but we can actually +string together the list of directories to move to `exercise-data` in one step: + +```bash +$ cd Desktop/shell-lesson-data/exercise-data +``` + +Check that we've moved to the right place by running `pwd` and `ls -F`. + +If we want to move up one level from the data directory, we could use `cd ..`. But there is another way to move to any +directory, regardless of your current location. + +So far, when specifying directory names, or even a directory path (as above), we have been using **relative paths**. +When you use a relative path with a command like `ls` or `cd`, it tries to find that location from where we are, rather +than from the root of the file system. + +However, it is possible to specify the **absolute path** to a directory by including its entire path from the root +directory, which is indicated by a leading slash. The leading `/` tells the computer to follow the path from the root of +the file system, so it always refers to exactly one directory, no matter where we are when we run the command. + +This allows us to move to our `shell-lesson-data` directory from anywhere on the filesystem (including from inside +`exercise-data`). To find the absolute path we're looking for, we can use `pwd` and then extract the piece we need to +move to `shell-lesson-data`. + +```bash +$ pwd +``` + +```output +/Users/nelle/Desktop/shell-lesson-data/exercise-data +``` + +```bash +$ cd /Users/nelle/Desktop/shell-lesson-data +``` + +Run `pwd` and `ls -F` to ensure that we're in the directory we expect. + +::::::::::::::::::::::::::::::::::::::::: callout + +## Two More Shortcuts + +The shell interprets a tilde (`~`) character at the start of a path to mean "the current user's home directory". For +example, if Nelle's home directory is `/Users/nelle`, then `~/data` is equivalent to `/Users/nelle/data`. This only +works if it is the first character in the path; `here/there/~/elsewhere` is *not* `here/there/Users/nelle/elsewhere`. + +Another shortcut is the `-` (dash) character. `cd` will translate `-` into *the previous directory I was in*, which is +faster than having to remember, then type, the full path. This is a *very* efficient way of moving *back and forth +between two directories* -- i.e. if you execute `cd -` twice, you end up back in the starting directory. + +The difference between `cd ..` and `cd -` is that the former brings you *up*, while the latter brings you *back*. + +*** + +Try it! First navigate to `~/Desktop/shell-lesson-data` (you should already be there). + +```bash +$ cd ~/Desktop/shell-lesson-data +``` + +Then `cd` into the `exercise-data/creatures` directory + +```bash +$ cd exercise-data/creatures +``` + +Now if you run + +```bash +$ cd - +``` + +you'll see you're back in `~/Desktop/shell-lesson-data`. Run `cd -` again and you're back in +`~/Desktop/shell-lesson-data/exercise-data/creatures` + + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Absolute vs Relative Paths + +Starting from `/Users/nelle/data`, which of the following commands could Nelle use to navigate to her home directory, +which is `/Users/nelle`? + +1. `cd .` +2. `cd /` +3. `cd /home/nelle` +4. `cd ../..` +5. `cd ~` +6. `cd home` +7. `cd ~/data/..` +8. `cd` +9. `cd ..` + +::::::::::::::: solution + +## Solution + +1. No: `.` stands for the current directory. +2. No: `/` stands for the root directory. +3. No: Nelle's home directory is `/Users/nelle`. +4. No: this command goes up two levels, i.e. ends in `/Users`. +5. Yes: `~` stands for the user's home directory, in this case `/Users/nelle`. +6. No: this command would navigate into a directory `home` in the current directory if it exists. +7. Yes: unnecessarily complicated, but correct. +8. Yes: shortcut to go back to the user's home directory. +9. Yes: goes up one level. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## Relative Path Resolution + +Using the filesystem diagram below, if `pwd` displays `/Users/thing`, what will `ls -F ../backup` display? + +1. `../backup: No such file or directory` +2. `2012-12-01 2013-01-08 2013-01-27` +3. `2012-12-01/ 2013-01-08/ 2013-01-27/` +4. `original/ pnas_final/ pnas_sub/` + +![](fig/filesystem-challenge.svg){alt='A directory tree below the Users directory where "/Users" contains the +directories "backup" and "thing"; "/Users/backup" contains "original","pnas\_final" and "pnas\_sub"; "/Users/thing" +contains "backup"; and"/Users/thing/backup" contains "2012-12-01", "2013-01-08" and"2013-01-27"'} + +::::::::::::::: solution + +## Solution + +1. No: there *is* a directory `backup` in `/Users`. +2. No: this is the content of `Users/thing/backup`, but with `..`, we asked for one level further up. +3. No: see previous explanation. +4. Yes: `../backup/` refers to `/Users/backup/`. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::: challenge + +## `ls` Reading Comprehension + +Using the filesystem diagram below, if `pwd` displays `/Users/backup`, and `-r` tells `ls` to display things in reverse +order, what command(s) will result in the following output: + +```output +pnas_sub/ pnas_final/ original/ +``` + +![](fig/filesystem-challenge.svg){alt='A directory tree below the Users directory where "/Users" contains the +directories "backup" and "thing"; "/Users/backup" contains "original","pnas\_final" and "pnas\_sub"; "/Users/thing" +contains "backup"; and"/Users/thing/backup" contains "2012-12-01", "2013-01-08" and"2013-01-27"'} + +1. `ls pwd` +2. `ls -r -F` +3. `ls -r -F /Users/backup` + +::::::::::::::: solution + +## Solution + +1. No: `pwd` is not the name of a directory. +2. Yes: `ls` without directory argument lists files and directories in the current directory. +3. Yes: uses the absolute path explicitly. + + + +::::::::::::::::::::::::: + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +## General Syntax of a Shell Command + +We have now encountered commands, options, and arguments, but it is perhaps useful to formalise some terminology. + +Consider the command below as a general example of a command, which we will dissect into its component parts: + +```bash +$ ls -F / +``` + +![](fig/shell_command_syntax.svg){alt='General syntax of a shell command'} + +`ls` is the **command**, with an **option** `-F` and an **argument** `/`. We've already encountered options which +either start with a single dash (`-`), known as **short options**, or two dashes (`--`), known as **long options**. +[Options] change the behavior of a command and [Arguments] tell the command what to operate on (e.g. files and +directories). Sometimes options and arguments are referred to as **parameters**. A command can be called with more +than one option and more than one argument, but a command doesn't always require an argument or an option. + +You might sometimes see options being referred to as **switches** or **flags**, especially for options that take no +argument. In this lesson we will stick with using the term *option*. + +Each part is separated by spaces. If you omit the space between `ls` and `-F` the shell will look for a command called +`ls-F`, which doesn't exist. Also, capitalization can be important. For example, `ls -s` will display the size of files +and directories alongside the names, while `ls -S` will sort the files and directories by size, as shown below: + +```bash +$ cd ~/Desktop/shell-lesson-data +$ ls -s exercise-data +``` + +```output +total 28 + 4 animal-counts 4 creatures 12 numbers.txt 4 alkanes 4 writing +``` + +Note that the sizes returned by `ls -s` are in *blocks*. As these are defined differently for different operating +systems, you may not obtain the same figures as in the example. + +```bash +$ ls -S exercise-data +``` + +```output +animal-counts creatures alkanes writing numbers.txt +``` + +Putting all that together, our command `ls -F /` above gives us a listing of files and directories in the root directory +`/`. An example of the output you might get from the above command is given below: + +```bash +$ ls -F / +``` + +```output +Applications/ System/ +Library/ Users/ +Network/ Volumes/ +``` + + +::::::::::::::::::::::::::::::::::::::::: callout +### When to use short or long options +When options exist as both short and long options: + +- Use the short option when typing commands directly into the shell to minimize keystrokes and get your task done + faster. +- Use the long option in scripts to provide clarity. It will be read many times and typed once. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + +### Nelle's Pipeline: Organizing Files + +Knowing this much about files and directories, Nelle is ready to organize the files that the protein assay machine will +create. + +She creates a directory called `north-pacific-gyre` (to remind herself where the data came from), which will contain the +data files from the assay machine and her data processing scripts. + +Each of her physical samples is labelled according to her lab's convention with a unique ten-character ID, such as +'NENE01729A'. This ID is what she used in her collection log to record the location, time, depth, and other +characteristics of the sample, so she decides to use it within the filename of each data file. Since the output of the +assay machine is plain text, she will call her files `NENE01729A.txt`, `NENE01812A.txt`, and so on. All 1520 files will +go into the same directory. + +Now in her current directory `shell-lesson-data`, Nelle can see what files she has using the command: + +```bash +$ ls north-pacific-gyre/ +``` + +This command is a lot to type, but she can let the shell do most of the work through what is called **tab completion**. +If she types: + +```bash +$ ls nor +``` + +and then presses Tab (the tab key on her keyboard), the shell automatically completes the directory name for +her: + +```bash +$ ls north-pacific-gyre/ +``` + +Pressing Tab again does nothing, since there are multiple possibilities; pressing Tab twice brings +up a list of all the files. + +If Nelle then presses G and then presses Tab again, the shell will append 'goo' since all files +that start with 'g' share the first three characters 'goo'. + +```bash +$ ls north-pacific-gyre/goo +``` + +To see all of those files, she can press Tab twice more. + +```bash +ls north-pacific-gyre/goo +goodiff.sh goostats.sh +``` + +This is called **tab completion**, and we will see it in many other tools as we go on. + + + +[Arguments]: https://swcarpentry.github.io/shell-novice/reference.html#argument + + +:::::::::::::::::::::::::::::::::::::::: keypoints + +- The file system is responsible for managing information on the disk. +- Information is stored in files, which are stored in directories (folders). +- Directories can also store other directories, which then form a directory tree. +- `pwd` prints the user's current working directory. +- `ls [path]` prints a listing of a specific file or directory; `ls` on its own lists the current working directory. +- `cd [path]` changes the current working directory. +- Most commands take options that begin with a single `-`. +- Directory names in a path are separated with `/` on Unix, but `\` on Windows. +- `/` on its own is the root directory of the whole file system. +- An absolute path specifies a location from the root of the file system. +- A relative path specifies a location starting from the current location. +- `.` on its own means 'the current directory'; `..` means 'the directory above the current one'. + +:::::::::::::::::::::::::::::::::::::::::::::::::: + + + +This chapter is from "[Software Carpentry The Unix Shell][swcarpentry-unix]". It is licensed under the +[CC-BY-4.0][cc-by-4]. + + +[swcarpentry-unix]: https://swcarpentry.github.io/shell-novice/ +[cc-by-4]: https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/config.yaml b/config.yaml index 5248792..0d71bd2 100644 --- a/config.yaml +++ b/config.yaml @@ -59,7 +59,10 @@ contact: 'topostats@sheffield.ac.uk' # FIXME # Order of episodes in your lesson episodes: -- introduction.md +- 01-command-line.md +- 02-filedir.md +- 03-create.md +# - introduction.md # Information for Learners learners: diff --git a/fig/filesystem-challenge.odg b/fig/filesystem-challenge.odg new file mode 100644 index 0000000000000000000000000000000000000000..c3bf2526efc6bda4b0504400120eb2dac33019f7 GIT binary patch literal 9835 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 +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Users + + + + + + + + + + + + + + thing + + + + + + + + + + + + + + backup + + + + + + + + + + + + + + 2012-12-01 + + + + + + + + + + + + + + 2013-01-08 + + + + + + + + + + + + + + 2013-01-27 + + + + + + + + + + + + + + backup + + + + + + + + + + + + + + original + + + + + + + + + + + + + + pnas_final + + + + + + + + + + + + + + pnas_sub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fig/filesystem.svg b/fig/filesystem.svg new file mode 100644 index 0000000..1a024b8 --- /dev/null +++ b/fig/filesystem.svg @@ -0,0 +1,286 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + / + + + + + + + + bin + + + + data + + + + Users + + + + tmp + + + + + + + + + + + diff --git a/fig/find-file-tree.odg b/fig/find-file-tree.odg new file mode 100644 index 0000000000000000000000000000000000000000..2cb72140b6723730a02a275f346e5d9aa6be553b GIT binary patch literal 12197 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 literal 0 HcmV?d00001 diff --git a/fig/find-file-tree.svg b/fig/find-file-tree.svg new file mode 100644 index 0000000..d830af7 --- /dev/null +++ b/fig/find-file-tree.svg @@ -0,0 +1,792 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + writing + + + + + + + thesis + + + + + + tools + + + + + + data + + + + + + + + + haiku.txt + + + + + + + + + + + + + + + oldtool + + + + + + old + + + + + + empty-draft.md + + + + format + + + + stats + + + + two.txt + + + + LittleWomen.txt + + + + one.txt + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fig/home-directories.svg b/fig/home-directories.svg new file mode 100644 index 0000000..9ae124e --- /dev/null +++ b/fig/home-directories.svg @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + Users + + + + tmp + + + + + + + + bin + + + + + + data + + + + + + + + + + + + + / + + + + + + + imhotep + + + + larry + + + + nelle + + + + + + + + + + + + + diff --git a/fig/homedir.odg b/fig/homedir.odg new file mode 100644 index 0000000000000000000000000000000000000000..f81b366c54f4cfa02399ff1749165c8cb5544d0e GIT binary patch literal 11826 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 + + + + background + + + + + + + Layer 1 + + + + wc -l *.pdb + + wc -l *.pdb + + + $ + Output in Shell + + OUT + + + wc -l *.pdb + + Output in File + + OUT + wc -l *.pdb + + wc -l *.pdb + + OUT + + + + $ + Output in Shell + + sort -n + IN + + OUT + + IN + + OUT + head -n 1 + + lengths + $ + $ + | + sort -n + | + head -n 1 + wc -l *.pdb + $ + | + sort -n + | + head -n 1 + wc -l *.pdb + $ + > + lengths + + diff --git a/fig/shell_command_syntax.svg b/fig/shell_command_syntax.svg new file mode 100644 index 0000000..a32b8f9 --- /dev/null +++ b/fig/shell_command_syntax.svg @@ -0,0 +1,47 @@ + + + + + + + diff --git a/fig/shell_script_for_loop_flow_chart.svg b/fig/shell_script_for_loop_flow_chart.svg new file mode 100644 index 0000000..028fb0d --- /dev/null +++ b/fig/shell_script_for_loop_flow_chart.svg @@ -0,0 +1,913 @@ + + + +image/svg+xmlfor filename in *.datdo echo cp $filename original-$filenamedone +Process Flow +Variable value +Process +Stdout +basilisk.dat +echo +cp basilisk.dat original-basilisk.dat +minotaur.dat +unicorn.dat +echo +echo +cp minotaur.dat original-minotaur.dat +cp unicorn.dat original-unicorn.dat +Start +Newvalue? +Yes +No +Run process +End +Phase +Shell script + \ No newline at end of file diff --git a/fig/standard-filesystem-hierarchy.svg b/fig/standard-filesystem-hierarchy.svg new file mode 100644 index 0000000..ba798b0 --- /dev/null +++ b/fig/standard-filesystem-hierarchy.svg @@ -0,0 +1,1534 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + / "root" + + + + + "essential user command binaries" + bashcatchmodcpdateechogrepgunzipgziphostnamekilllesslnlsmkdirmoremountmvnanoopenpingpspwdrmshsutartouchumountuname + /bin + + + + + /dev + "device filesincl. /dev/null" + + + + + /home + "user homedirectories" + + + + + + /proc + "process & kernelinformation files" + + + + + + /lib + "libraries &kernel modules" + + + + + /mnt + "mount files fortemporary filesystems" + + + + + /usr + "read-only user applicationsupport data & binaries" + + + "standard includefiles for 'C' code" + "obj, bin, libfiles for coding& packages" + + /usr/bin + "most usercommands" + + /usr/include + + /usr/lib + + /usr/local + "local software" + + /usr/local/bin/usr/local/lib/usr/local/man/usr/local/sbin/usr/local/share + /usr/share + "static data sharableaccross all architectures" + + /usr/share/man + "manual pages" + + + + + + + /etc + "configuration files for the system" + crontabcupsfontsfstabhost.confhostnamehostshosts.allowhosts.denyinitinit.dissuemachine-idmtabmtools.confnanorcnetworkspasswdprofileprotocolsresolv.confrpcsecurettyservicesshellstimezone + + + + + + /var + "variable data files" + + + /var/cache + "application cache data" + + + + "data modified asprogrammes run" + /var/lib + + + + "lock files to track resources in use" + /var/lock + + + + /var/log + "log files" + + + /var/spool + "tasks waiting tobe processed" + + /var/spool/cron/var/spool/cups/var/spool/mail + + /var/opt + "variable data for installed packages" + + + /var/tmp + "temporary files saved between reboots" + + + + /sbin + "essential systembinaries" + fdiskfsckgettyhaltifconfiginitmkfsmkswaprebootroute + + + + + /opt + "optional softwareapplications" + + + + /root + "home dir. forthe root user" + + + + diff --git a/introduction.md b/introduction.md deleted file mode 100644 index 7065d23..0000000 --- a/introduction.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: "Using Markdown" -teaching: 10 -exercises: 2 ---- - -:::::::::::::::::::::::::::::::::::::: questions - -- How do you write a lesson using Markdown and `{sandpaper}`? - -:::::::::::::::::::::::::::::::::::::::::::::::: - -::::::::::::::::::::::::::::::::::::: objectives - -- Explain how to use markdown with The Carpentries Workbench -- Demonstrate how to include pieces of code, figures, and nested challenge blocks - -:::::::::::::::::::::::::::::::::::::::::::::::: - -## Introduction - -This is a lesson created via The Carpentries Workbench. It is written in -[Pandoc-flavored Markdown](https://pandoc.org/MANUAL.txt) for static files and -[R Markdown][r-markdown] for dynamic files that can render code into output. -Please refer to the [Introduction to The Carpentries -Workbench](https://carpentries.github.io/sandpaper-docs/) for full documentation. - -What you need to know is that there are three sections required for a valid -Carpentries lesson: - - 1. `questions` are displayed at the beginning of the episode to prime the - learner for the content. - 2. `objectives` are the learning objectives for an episode displayed with - the questions. - 3. `keypoints` are displayed at the end of the episode to reinforce the - objectives. - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor - -Inline instructor notes can help inform instructors of timing challenges -associated with the lessons. They appear in the "Instructor View" - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -::::::::::::::::::::::::::::::::::::: challenge - -## Challenge 1: Can you do it? - -What is the output of this command? - -```r -paste("This", "new", "lesson", "looks", "good") -``` - -:::::::::::::::::::::::: solution - -## Output - -```output -[1] "This new lesson looks good" -``` - -::::::::::::::::::::::::::::::::: - - -## Challenge 2: how do you nest solutions within challenge blocks? - -:::::::::::::::::::::::: solution - -You can add a line with at least three colons and a `solution` tag. - -::::::::::::::::::::::::::::::::: -:::::::::::::::::::::::::::::::::::::::::::::::: - -## Figures - -You can use standard markdown for static figures with the following syntax: - -`![optional caption that appears below the figure](figure url){alt='alt text for -accessibility purposes'}` - -![You belong in The Carpentries!](https://raw.githubusercontent.com/carpentries/logo/master/Badge_Carpentries.svg){alt='Blue Carpentries hex person logo with no text.'} - -::::::::::::::::::::::::::::::::::::: callout - -Callout sections can highlight information. - -They are sometimes used to emphasise particularly important points -but are also used in some lessons to present "asides": -content that is not central to the narrative of the lesson, -e.g. by providing the answer to a commonly-asked question. - -:::::::::::::::::::::::::::::::::::::::::::::::: - - -## Math - -One of our episodes contains $\LaTeX$ equations when describing how to create -dynamic reports with {knitr}, so we now use mathjax to describe this: - -`$\alpha = \dfrac{1}{(1 - \beta)^2}$` becomes: $\alpha = \dfrac{1}{(1 - \beta)^2}$ - -Cool, right? - -::::::::::::::::::::::::::::::::::::: keypoints - -- Use `.md` files for episodes when you want static content -- Use `.Rmd` files for episodes when you need to generate output -- Run `sandpaper::check_lesson()` to identify any issues with your lesson -- Run `sandpaper::build_lesson()` to preview your lesson locally - -:::::::::::::::::::::::::::::::::::::::::::::::: - -[r-markdown]: https://rmarkdown.rstudio.com/ diff --git a/md5sum.txt b/md5sum.txt index de2300d..79b19ca 100644 --- a/md5sum.txt +++ b/md5sum.txt @@ -1,11 +1,13 @@ "file" "checksum" "built" "date" "CODE_OF_CONDUCT.md" "c93c83c630db2fe2462240bf72552548" "site/built/CODE_OF_CONDUCT.md" "2024-01-08" "LICENSE.md" "b24ebbb41b14ca25cf6b8216dda83e5f" "site/built/LICENSE.md" "2024-01-08" -"config.yaml" "8b5eb93fb1a6714e2dfbcf08e1686b5c" "site/built/config.yaml" "2024-01-12" +"config.yaml" "ef77f9782e72c52401ee4cd60ae36581" "site/built/config.yaml" "2024-01-29" "index.md" "32ded82e3af3920844de9879f05cc873" "site/built/index.md" "2024-01-26" "links.md" "8184cf4149eafbf03ce8da8ff0778c14" "site/built/links.md" "2024-01-08" -"episodes/introduction.md" "6c55d31b41d322729fb3276f8d4371fc" "site/built/introduction.md" "2024-01-08" +"episodes/01-command-line.md" "b0e00df5274eb130f7872a9896b976ff" "site/built/01-command-line.md" "2024-01-29" +"episodes/02-filedir.md" "e64617a09bb50fc08a24213e7d8f4868" "site/built/02-filedir.md" "2024-01-29" +"episodes/03-create.md" "bbea2486b75532c2252d1167039c903c" "site/built/03-create.md" "2024-01-29" "instructors/instructor-notes.md" "69e9a8d25797039f14984f17abc80042" "site/built/instructor-notes.md" "2024-01-26" -"learners/reference.md" "1c7cc4e229304d9806a13f69ca1b8ba4" "site/built/reference.md" "2024-01-08" +"learners/reference.md" "51f5c5ea490496c21406ae9a67860bb7" "site/built/reference.md" "2024-01-29" "learners/setup.md" "8ae366f9ee33e5f83c28d7b4d4765aa8" "site/built/setup.md" "2024-01-26" "profiles/learner-profiles.md" "60b93493cf1da06dfd63255d73854461" "site/built/learner-profiles.md" "2024-01-08" diff --git a/reference.md b/reference.md index ba26b9f..40c72db 100644 --- a/reference.md +++ b/reference.md @@ -4,5 +4,72 @@ title: 'Reference' ## Glossary -This is a placeholder file. Please add content here. +### A ++ **AFM** Atomic Force Microscopy + +### B + +### C + ++ **Conda** a package for managing reproducible virtual environments. + +### D + +### E + +### F + +### G + ++ **Grain** the term used for image molecules. + +### H + +### I + +### J + +### K + +### L + +### M + +### N + +### O + +### P + ++ **Python** a general purpose interpreted programming language. See [Python.org][python]. + +### Q + +### R + +### S + +### T + ++ **TopoStats** software written in Python for batch processing images. + ++ **Tracing** obtaining a single-pixel width outline of the detected molecules. + +### U + +### V + +### W + +### X + +### Y + ++ **YAML** a recursive acronym (YAML Ain't Markup Language) it is ASCII plain text files that is used for configuring + how TopoStats will process images. + +### Z + + +[python]: https://www.python.org