Moving Around in the Unix World =============================== Video for this Section ---------------------- Video for this section is not available yet. Get Some Files ============== In order to learn about unix files and directories, let's get some files and directories that we can explore together. To do this we will use the ``tar`` command. ``Tar`` is an archiving tool for packing up a set of files *and* directories for portable "shipment", and you will often see a, so-called, *tarball* (an archive file in the *tar* format) for download on the web. A **tar** archive is really just all the files "glued" together, one after the other, with some header information. Usually, this file is then compressed in size using the **gzip** method. A similar way to do both of these tasks (archiving several files into one and compressing the archive) is the **zip** format, which creates files that end in ``.zip``. You can download the tar file for our course by copying this link, pasting it into a shell terminal window at the prompt, and hitting ENTER. ``curl -O dirac.physics.pacific.edu/phys/jhetrick/www/PHYS27/unixplay.tar.gz`` Once you have downloaded the file, do a directory listing and see if you see the file **unixplay.tar.gz**. If so, you can unpack the archive by typing (or cutting and pasting) the following command at the prompt: ``tar zxvf unixplay.tar.gz`` Now do a listing and verify that this command has created a new directory called ``unixplay/``. We'll come back to these files shortly. The Unix File System ==================== Now that you have your Fedora system running and have some files to explore, let's learn to move around a bit. We've got to get used to doing things through a text based shell window. While that might seem extremely limiting at first, it's actually *much* more efficient, especially when you are connecting to another computer (like a supercomputer on the other side of the country). A shell terminal uses very little bandwidth since it only needs to transfer characters instead of pictures and mouse movements. You are probably used to the **Point-and-Click** (GUI, or *G*raphical *U*ser *I*nterface) environment of Windows and Macs: when you want to do something, you (double) click on its **icon**, possibly enter some parameters (a file to edit for example), and then work within that appliction. At the end you might save your work to a file, or print it. The other big difference is that to find your files, you use a Graphical File Browser , like the one below. (We'll come back to the boxes marked with an arrow in just a minute) .. image:: imgs/500px-Win7ex-content.png in Windows, or .. image:: imgs/macFileBrowser.png on a Mac. To find files and folders, you navigate your way around by clicking on icons, like this |folderimg| .. |folderimg| image:: imgs/folder.jpg :width: 40px .. note:: In Unix, *folders* are called **directories**. That's why the Unix command to move to a new directory is called **cd**, for *Change Directory* . This command moves you to another folder--which I will henceforth call by its proper name, a **directory**. Using a Graphical File Browser, you usually see all the files and subfolders as little icons which often represent the type of file. You probably know how to change this behavior. ------------------ In your **Host** OS--either *Windows* (PC) or *OSX* (Mac), open some Folder on your computer with many files. Click the red box marked on the images above, on the top menu bar. Choose to simply *List* the files, or show the *Details*. Also you see that Folders are shown with a small Folder icon so that you can distinguish these from regular files. Notice that with *Details* you get size information, type, and date of last modification. Now change the setting back to what it was before (or a new one if you like). We will do something very similar to this in a Unix shell window, listing files from the prompt in a text-based shell window. You will soon find it is almost as easy as the GUI way, and in many cases more powerful. Your **Home** Directory ~~~~~~~~~~~~~~~~~~~~~~~ Open an shell/terminal window. ----------------------- There is a default directory for each user, called the **Home** directory. You may recall from the last chapter that the "full name" of your **Home** directory is ''/home/YOURUSERNAME'' . When you start a shell , or if you login to a computer where you have a unix account, the shell will give you a *prompt*, and place you in your **Home** directory. This is where your init files are, like ''.bashrc'' and others. In fact, the way I have set up your system, the prompt tells you this. A short hand symbol for your HOME dir is the symbol "**~**" (the tilda). Notice that in your prompt there is the following: **[~]**, meaning that you are working in your HOME dir (I will often say "*dir*" for directory). | Changing to a different directory --------------------------------- We've already learned about this, but mention it here again for completeness. ``cd`` (change directory) ~~~~~~~~~~~~~~~~~~~~~~~~~ The command **cd** means change the *current working directory* to 'directory'. The current working directory may be thought of as the directory you are in, i.e. your current position in the file-system tree. Let's change to the ``unixplay/`` directory that you have just made by unpacking the tar file. .. note:: I'm referring to the directory as ``unixplay/`` with a ``/`` at the end. This is a unix-guru way of saying that *unixplay* is a directory (by writing it with an ending ``/``. However you don't have to add that ``/`` when typing it in the the ``cd`` command. Type the following: .. code-block:: bash sci[~]>cd unixplay sci[unixplay]> Type ``ls`` (or better, the *alias* ``l``) to see the contents. You should see .. code-block:: bash sci[~/unixplay]>l anotherFile dirTWO/ gammaData/ scifi_list.txt yetanother dirONE/ file_unixplay.txt ints.dat testfile | The Directories ``.`` and ``..`` ================================ Still in the ``unixplay/`` directory, type ``la`` (*alias* for ``ls -a``) As you can now see, in the unixplay/ directory (and in all other directories), there are two special directories called (``.``) and (``..``) The current directory "." ~~~~~~~~~~~~~~~~~~~~~~~~~ In UNIX, "``.``" means the current directory, so typing ``cd .`` means stay where you are (the unixplay/ directory). This may not seem very useful at first, but using "``.``" as the name of the current directory will save a lot of typing, as we shall see later. We also need the ``.`` when trying to copy or move files to the current directory. The parent directory "``..``" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "``..``" means the parent of the current directory, so typing ``cd ..`` will take you one up one level in the directory tree. | **Try it now**. In your ``unixplay/`` directory, type: ``cd ..`` This should move you back to your home directory and you prompt should show this by showing **[~]**. Now ``cd`` back down to the ``unixplay`` directory. You should see **[unixplay]** in the prompt, helping you to remember where you are. Going Home ---------- Typing ``cd`` with no directory argument always returns you to your *Home* directory. This is very useful if you get lost in the file system. **Try it** If you are in your ``unixplay/`` dir, ``cd`` down one more level into ``dirONE/``. .. note:: In Unix, names are *case-sensitive*, meaning that the directory ``dirONE`` and ``dirone`` are different. **Now**, type ``cd`` by itself. This takes you back to your *home* directory. .. note:: Wherever you are, typing a bare ``cd`` command will take you *Home*. | Let's see how far up in the unix file system we can go. Type ``cd`` to start from your home directory. Does your prompt say **[~]** ? Now type: ``cd ..`` to move up one level. Your prompt should have **[home]** in it. All users' *home* directories are subdirectories of a dir called ``home/``. Type ``cd ..`` to go up from there. You should see **[/]** in the prompt. Type ``cd ..`` again. Did anything happen? No--you should still see the same **[/]** in the prompt. That's because you have gone up as far as you can go. The top level directory in a Unix file system is called, simply, ``/``. Below that are a number of dirs, one of which is ``home/``, and below that is your home dir, *e.g.* ``/home/jhetrick/``. Now type ``cd`` to go *home*. | Pathnames ========= Type the following command at the prompt. ``pwd`` (print working directory) *Pathnames* enable you to work out where you are in relation to the whole file-system. For example, to find out the full pathname of your ``dirONE/`` directory in the ``unixplay/`` directory. navigate to ``dirONE/`` directory using ``cd``, then type ``pwd`` .. code-block:: bash sci[~]>cd unixplay sci[~/unixplay]>cd dirONE sci[~/unixplay/dirONE]>pwd /home/jhetrick/unixplay/dirONE The full pathname to the ``dirONE`` directory is ``/home/jhetrick/unixplay/dirONE`` | Unix commands for files and directories ======================================= First let's review the ``ls`` command that we've already seen. ls (list) ~~~~~~~~~ Let's review: When you first login, your prompt is placed in your home directory. Your home directory has the same name as your user-name, for example, **jhetrick** (or " **~**" for short). To find out what files and directories are in your current directory, you type .. code-block:: bash ls The **ls** command *lists* the contents of your current working directory. .. code-block:: bash sci[~]>ls Desktop Downloads Pictures Templates winDesktop Documents Music Public Videos winDocs If there were no files visible in your home directory, the prompt would simply be returned. Command Options (aka Switches) ------------------------------ As we have seen, it turns out that ``ls`` does not, actually, list **all** the files in your home directory only *non-hidden* files. In unix it's easy to make a hidden file, simply start its name with a dot (.) Files beginning with a dot (such as ``.bashrc``, ``.emacs``, etc.) are known as *hidden* files and usually contain program configuration information. ------- However you can list *ALL* the files in your home dir by giving *ls* a **switch** to modify its behavior. To list all files in your home directory including those whose names begin with a dot, type ``ls -a`` ~~~~~~~~~ This now produces .. code-block:: bash sci[~]>ls -a . Downloads Pictures .. .emacs Public .bash_history .esd_auth Templates .bash_logout .gnome2 .vboxclient-clipboard.pid .bash_profile .gnome2_private .vboxclient-display.pid .bashrc .gnupg .vboxclient-draganddrop.pid .cache .gtkrc-2.0-kde4 .vboxclient-seamless.pid .config .kde Videos Desktop .local winDesktop .dmrc .mozilla winDocs Documents Music .xsession-errors As you can see, ``ls -a`` lists many files that are normally hidden. ``-a`` is an example of an option (sometimes called a *switch*). The options change the behaviour of the command. There are online manual pages that tell you which options a particular command can take, and how each option modifies the behaviour of the command. .. note:: We setup several *aliases* for ``ls`` with various switches in your ``.bashrc`` file in the last chapter. You have an *alias* for ``ls -aF`` in your ``.bashrc`` file. The alias is ``la``, so typing ``la`` is exactly the same as typing ``ls -aF``. ``ls -F`` ~~~~~~~~~ **Alias**: ``l`` Another option I like to add to your toolkit is the *-F* (Format) switch for *ls*. This option puts "/"s at the end of each directory, which makes it easier to distinguish files from subdirectories. It also puts a "\*" at the end of each file which is *executable*. These files are programs or "*scripts* that can be run (like a *.exe* file in Windows), and an "\@" at the end of *links*. .. code-block:: bash sci[~]>ls -F Desktop/ Downloads/ Pictures/ Templates/ winDesktop@ Documents/ Music/ Public/ Videos/ winDocs@ As you can see this option makes it easier to see which files are just files and which are subdirectories. It's particularley useful when you are working in a terminal which doesn't support color coding. .. admonition:: Question Which files are directories? What type are the other files? | ``Man`` (manual) pages ---------------------- A wonderful feature of the unix shell are the *man pages*. At the prompt, type ``man ls`` This will bring up the *Manual Page(s)* for the ``ls`` command. The man page is a text file which is opened in the ``less`` pager that we met in the last chapter. ``less`` show you one terminal window full of the file at a time, and lets you move forward and backward through the manual with PageUp and PageDown (or SpaceBar and "b"). .. code-block:: z LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -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 [More] The **man** page is *GREAT* for learning about all the possible switches and is useful when you want to do something and think ``ls`` *might* have a switch that does what you want. For example, scrolling through the man page for ``ls``, you can see that one of the switches is ``-1`` (minus one). This switch lists one file per line. I have used that switch many times when I need to produce a single column list of files to pass to another program. Apropos (man -k) ~~~~~~~~~~~~~~~~ If you don't know the name of a command, but want to search all possible shell commands, you can type: ``apropos`` SEARCH-WORD For example, suppose you didn't know that there was a unix command to list the contents of your directory (but you did know about the ``apropos`` command). You could type: ``apropos list`` This produces: .. code-block:: bash sci[~]>apropos list uffixes (7) - list of file suffixes acl (5) - Access Control Lists appres (1) - list X application resource database argz (3) - functions to handle an argz list argz_add (3) - functions to handle an argz list argz_add_sep (3) - functions to handle an argz list ... ls (1) - list directory contents ... XwcTextPropertyToTextList (3) - convert text lists and text property structures zipinfo (1) - list detailed information about a ZIP archive zonetab2pot.py (1) - Converts a timezone list to a PO file template. showing all the commands and Manual entries with the word "list" in the description. From this list you would learn that there is the ``ls`` command, and could learn more about it by typing ``man ls``. | **Try** doing: ``man man`` | Making Directories ------------------ ``mkdir`` (make directory) ~~~~~~~~~~~~~~~~~~~~~~~~~~ We will often need to make a subdirectory in your current directory to hold new files, or particularly, when you start a new project. .. topic:: TIP: Keep different projects in separate directories and subdirectories, and give files names that help identify them, like: ``comptonExptTheta35deg.dat`` To make a subdirectory called **newdir** in your home directory type the following: ``mkdir newdir`` .. code-block:: bash sci[~]>mkdir newdir sci[~]> The shell returns the prompt. However it *has* just created the **newdir** directory. To see the directory you have just created, type ``l`` .. code-block:: bash sci[~]>mkdir newdir sci[~]>l Desktop/ Downloads/ newdir/ Public/ unixplay/ Videos/ winDocs@ Documents/ Music/ Pictures/ Templates/ unixplay.tar.gz winDesktop@ Understanding pathnames ======================= First type ``cd`` to get back to your home-directory, then type ``l newdir`` to list the conents of your newdir directory. Now type ``l subdir`` You will get a message like this - **subdir: No such file or directory** The reason is, subdir is not in your current working directory. To use a command on a file (or directory) not in the current working directory (the directory you are currently in), you must either ``cd`` to the correct directory, or specify its "**full pathname**". To list the contents of your subdir directory, you must type ``l newdir/subdir`` ------------------- Home directories can also be referred to by the tilde ``~`` character. It can be used to specify paths starting at your home directory. So typing ``ls ~/newdir`` will list the contents of your newdir directory, no matter where you currently are in the file system. Try this: ``cd`` down into ``subdir/`` Try to list the contents of ``newdir/`` by doing ``ls newdir``. This fails since newdir/ is not in subdir. Now use the full pathname with the ~ shortcut: ``ls ~/newdir`` This time it works. | What do you think ``ls ~`` would list? | What do you think ``ls ~/..`` would list? | The ``tree`` command ~~~~~~~~~~~~~~~~~~~~ A handy command to know about is the ``tree`` command. Try it in your home directory. Type: ``tree`` at the prompt. It should show you a "*tree*" (with branches) of your directories and files. If you just want to see *directories*, type: ``tree -d`` with the ``-d`` switch. If you want to see *sizes* of files and directories, use the ``-h`` switch (**Try it**). | Command Summary =============== +---------------------+-------------------------------------+ | Command | Meaning | +=====================+=====================================+ | ls | list files and directories | +---------------------+-------------------------------------+ | ls -a | list all files and directories | +---------------------+-------------------------------------+ | mkdir dir | make a directory called dir | +---------------------+-------------------------------------+ | cd dir | directory change to named directory | +---------------------+-------------------------------------+ | cd | change to home directory | +---------------------+-------------------------------------+ | cd ~ | change to home directory | +---------------------+-------------------------------------+ | cd .. | change to parent directory | +---------------------+-------------------------------------+ | pwd | display the path of the current | | | directory | +---------------------+-------------------------------------+ | man cmd | page through manual entries for cmd | +---------------------+-------------------------------------+ | tar zxvf file.tar.gz| unpack a .tar.gz file | +---------------------+-------------------------------------+ | tree | show directory tree structure | +---------------------+-------------------------------------+ | +----------------+-------------------+------------------------+ | aliases |equivalent to | meaning | +================+===================+========================+ | l | ls -F | list (formatted) | +----------------+-------------------+------------------------+ | la | ls -aF | list all (incl. hidden)| +----------------+-------------------+------------------------+ | ll | ls -lF | long list | +----------------+-------------------+------------------------+ | lt | ls -t | head -20 | list most recent | +----------------+-------------------+------------------------+ | m | less | file pager | +----------------+-------------------+------------------------+ | fin file | find . -name file | find a file | +----------------+-------------------+------------------------+