# Assignment Goals

The goals of this assignment are:
1. To explore shell scripting languages using bash

# The Assignment

The purpose of this assignment is to write a shell script to help automate a task, and to explore the language by which your shell exposes its functionality to you. Shell scripting allows you to write code, including variables, conditionals, and interation, that executes shell commands. Although your shell primarily manages the running processes on your computer, it exposes that functionality with a Turing complete language!

## Part 1: Creating an MD5 Dictionary

Open your shell and execute the following command:

find . -type 'f' -exec md5sum {} \; 2>/dev/null

This command searches for all files (per the -type 'f' clause) under your current working directory and recursively into all subdirectories. It also executes a command on each file: specifically, it computes an MD5 hash on the contents of each file. The 2>/dev/null causes all error messages (like file permissions failures) to be suppressed, so you’ll only get meaningful output for the files that you can read. The computed MD5 hash changes if the contents of the file changes. The format of each line is:

<md5 hash><space><space><file path>\n


Use the cut or awk command to read the hash and the file path into two separate bash variables. Write those to a file in the following format:

<file path><space><md5 hash>\n


You can append two commands together using the pipe character: for example, the command below lists all files in your directory, and pipes the output to the sort command, which sorts the output alphabetically:

ls | sort


You can also append > output to the end of a command to write its output to a file called output (or any file name you choose). Let’s output to a file called md5dict.txt. To append to an existing file, you can use >> output instead.

To use the cut command, you can do the following:

echo test,tube | cut -f2 -d','

which obtains the second field (tube) from the line of text, using the delimiter ,.

Arrange your command(s) to compute the MD5 hash into a shell script and test it. Write the following line as the first line of your script file, so that your computer knows it is a bash script:

#!/bin/bash


and, before you execute it, run this to make the file executable (I’ll use the filename myscript.sh as an example, but you can call your file whatever you’d like!):

chmod a+x myscript.sh
./myscript.sh


## Part 2: Checking for Changes

In your shell script (or in a new shell script), before you create the MD5 dictionary file from Part 1, check if the md5dict.txt file already exists. If it does, read each entry in the file and the MD5 hash into two bash variables. Use the file path variable, and if the file exists, compute md5sum on the file, storing the current MD5 hash into another variable. If the MD5 does not match the one you read in your original dictionary, print out that the file has changed to the screen. If the file no longer exists, print out a message indicating that as well. If the file exists and the MD5 hashes match, print nothing (this way, you have a concise log of all the files that have changed in your directory!).

Finally, we need to see if any new files were created. Use a find command to find all files in your current working directory. For each one, grep for it in your md5dict.txt file. If no match is found, print out hat you have identified a new file in your working directory.

To find all files in your directory and loop over each one, you can use this snippet:

find . -print0 | while IFS= read -r -d '' line; do
# Your code here, which can use the \${line} variable
done


Once you are done, you can proceed with your code from Part 1, so that you re-generate a new md5dict.txt file. Alternatively, you can organize Part 1 and Part 2 into two separate shell scripts, if you prefer.

## Submission

• Describe what you did, how you did it, what challenges you encountered, and how you solved them.
• Please answer any questions found throughout the narrative of this assignment.
• If collaboration with a buddy was permitted, did you work with a buddy on this assignment? If so, who? If not, do you certify that this submission represents your own original work?
• Please identify any and all portions of your submission that were not originally written by you (for example, code originally written by your buddy, or anything taken or adapted from a non-classroom resource). It is always OK to use your textbook and instructor notes; however, you are certifying that any portions not designated as coming from an outside person or source are your own original work.
• Approximately how many hours it took you to finish this assignment (I will not judge you for this at all...I am simply using it to gauge if the assignments are too easy or hard)?
• Your overall impression of the assignment. Did you love it, hate it, or were you neutral? One word answers are fine, but if you have any suggestions for the future let me know.