The ls Command And Basic File System Structure

Where am I?

Hello again,

Today we’ll continue with another command that you can type into your terminal. We’ve already seen that pwd (print working directory) can tell us where we are, but what about if we want to see our files?

The ls (list) command does just that:

$> ls
dead.letter mbox        rtsignal.c    src

This lists the files and folders that are in the directory that I’m currently in: /home/gabe. I can confirm I’m in the folder I think I’m in by re-issuing the pwd command:

$> pwd
/home/gabe

If I want more details on those files I can do this:

$> ls -l
total 3056
-rw-------  1 gabe  gabe        7 Feb  7  2014 dead.letter
-rw-------  1 gabe  gabe  1525103 Oct 15 22:05 mbox
-rw-r-----  1 gabe  gabe     3337 Nov  5 15:11 rtsignal.c
drwxr-xr-x  2 gabe  gabe      512 Nov 10 21:22 src

Here I called the list program (ls), and then I added a -l (dash ell) after the command. This is how you specify an option. The -l (dash ell) option tells the ls program that I would like the ‘long’ or detailed list of files.

This gives me extra information about each file. I won’t go into all the specifics now, but something useful is the ’d’ in the first column of the last line. This tells me that the src entry is actually a directory (folder), while all the rest of them are files. We will cover the rest of the information provided in a future post.

We’ll take a small detour now to talk a bit about file system organization on a UNIX system.

The long and the short of it is, you have one main folder, called ‘the root directory’ represented by a single slash /. Inside that folder you can have as many sub-folders as you like, and each of those can have sub-folders as well. I’m calling them folders as that’s how most people from a graphical background know them, but in the command line world, we call folders directories.

On most UNIX systems, there are several ‘system folders’ that come pre-installed, if you issue the following commands you should see some of them.

First, we will cd ‘change directory’ to the root folder (/):

$> cd /

There is no output after I type this command, this is normal.

Then, ask for the long directory listing (ls -l):

$> ls -l
total 45556
drwxr-xr-x   2 root  wheel     1024 Nov  7 12:22 bin
-rw-r--r--   1 root  wheel    69660 Nov  8 22:24 boot
-rw-r--r--   1 root  wheel  9962236 Nov  8 21:24 bsd
drwxr-xr-x   3 root  wheel    19456 Nov  8 22:25 dev
drwxr-xr-x  64 root  wheel     3584 Nov  9 15:45 etc
drwxr-xr-x   3 root  wheel      512 Aug 13  2013 home

I’ve only included a sampling of what’s in my / directory, but it’s enough to be instructive w/out being overwhelming (I hope).

Here we can see several sub-folders (bin, dev, etc, and home) and two files (bsd and boot). Each of these folders can have sub-folders as well. For example, if I change into the home folder:

$> cd home

and re-issue the list command with the long listing option (-l):

$> ls -l
total 56
drwxr-xr-x    9 ariadne  ariadne  512 Sep 28 09:10 ariadne
drwxr-xr-x  130 gabe   gabe    7680 Nov 10 21:30 gabe

I see two folders, ariadne and gabe. These correspond to users that exist on my system and are what we call those user’s ‘home directories.’ To write out the full path to ariadne’s home directory, I would write:

/home/ariadne and say: “slash home slash ariadne”

That’s our detour, now back to the ls (list) command.

There are other options we can send to the ls command depending on what we’d like it to do. Most programs in the UNIX world have options that are almost always specified in the same way, a dash followed by a letter. Some examples from the ls command (you should follow along with these in your terminal):

$> ls -1

(dash one) This forces the output of the ls command to be one entry per line.

$> ls -a

(dash a) This tells the ls command to list all files, including those that begin with a ‘.’ which are normally hidden (more on that later)

$> ls -F

(dash capital eff) This tells the ls command to make the type of file more obvious, by for example appending a / after any name that is a folder (directory).

Oftentimes, several options may be combined as well, as in the case of:

$> ls -lh

(dash ell aitch) Which tells ls to give us a ‘long’ listing, and also to use the ‘h’ option to represent the sizes of the files in “human readable” form. If you do this, you should see a letter after the file size representing (B)ytes, (K)ilobytes, (M)egabytes, and (G)igabytes.

Next time we’ll look at how to find out which options a particular command understands, before getting back to more useful stuff.

New Terms

  • directory - folder
  • ls - list directory contents
  • ls -l - long listing of directory contents
  • ls -1 - list contents of directory, one per line
  • ls -a - list all contents of directory, including hidden files
  • ls -lh - list all contents of directory, and make sizes human readable.
  • ls -F - Add some extra identifying information to each directory item listed to make it easier to tell the difference between a file and directory.
  • man ls - Read the manual for the ls command

Have a suggestion for a future post? A question about an article? Just want to say hi? Drop me an email: gabe@cotcli.com

Want to receive these posts directly to your inbox? Subscribe here.