Working with Unix Directories

Working with Unix Directories

Unix uses a hierarchical file system for storing files. This system consists of a "root" directory which is made up of sub-directories which in turn are made up of sub-directories. If you are not already familiar with the concept of a hierarchical file system, see one of the general books listed in the references for a detailed discussion of this structure.

Listing Files: ls Command

The ls command is used to list the contents (names of files) in a directory. If no directory path is specified, ls will display the files in the current directory.

Display a list of files:


Display file characteristics:

  ls  -F

When this option is used, the names of executable files are followed by an asterisk ("*") and directory names will be followed by a slash ("/"). On some Unix systems, directory names are followed by both a slash and an asterisk ("/*").

Listing Hidden Files

Files which begin with a dot (.) are hidden and not displayed by the ls command unless specifically requested. These files are frequently used as configuration files by application programs. To display these files, enter:

  ls  -a

Long Listing of File Properties

To obtain a "long" listing of all files in the current directory, enter:

  ls  -la

This listing includes the following information:

  • File Permissions: who has permission to read, write, or execute the file.
    • A "d" in the first column indicates that this file corresponds to a directory, a "-" indicates a regular file.
    • The next three columns indicate whether the owner has read, write, or execute permission for the file.
    • The next three columns indicate whether other members in your group have read, write, or execute permission for the file.
    • The next three columns indicate whether individuals other than the owner and members in the owners group have read, write, or execute permission for the file.
  • Number of Links
  • Owner Name
  • Group Name: On some Unix systems (typically BSD based) it is necessary to include the -g flag in order to display the group name; on VTAIX and System V based systems, inclusion of the -g option will suppress display of the group membership column.
  • Size in Bytes
  • Date of Last Modification
  • Filename

Directory Utilities

The primary commands used when working with directories are:

pwd   print (display) working directory

cd   change directory

    cd xmp

mkdir   make directory

    mkdir  test_dir
    ls  -F

mv   move files between directories

    ls  *.c
    ls  test_dir
    mv  my_source.c  test_dir
    ls  *.c
    ls  test_dir

rmdir   remove directory

      ls -a  test_dir
      rmdir  test_dir

      mv     testdir/mysource.c  .
      ls -a  test_dir
      rmdir  test_dir
      ls  -F

Note:   You cannot remove a directory until you have first moved or removed (deleted) all of the files it contains. You must also have write permission for the parent directory containing the directory you wish to remove.

Directories & System Organization

You should become familiar with the definitions of the following terms:

Current Working Directory (.)
The directory within which you are currently working. In an earlier exercise, you copied the sample files to the "." directory. To Print (display) the Working Directory, enter:

Parent Directory (..)
The directory immediately above the current directory in the directory hierarchy. Observe the results of entering the following commands:

  cd ..
  cd ..
Home Directory
The default directory associate with a userid. To change to the home directory of the VTAIX Class Instructors Id, enter:

  cd  ~aixstu00

The ~ abbreviation is only available if you are using the C or Korn Shell. To change to your own home directory, you can simply enter:

relative path
Start from current directory (.) and observe the results of the following commands:

  cd xmp
  cd c
absolute path
Start from "root" (/) and observe the results of entering the following commands:

  cd /etc
  cd xmp
  cd $HOME/xmp
  cd /

Executing Commands

  • In the Current Directory: Include ./ in front of the filename.
  • In Directories in the Search Path: Enter the filename (use "echo $PATH" to display the search path).
  • Otherwise: Include absolute path followed by filename.

The Typical Unix File System

As an exercise, change to the root directory and observe the sub-directories it contains:

  cd /
  ls  -F

Recall that the "-F" option of the ls command appends a slash ("/") to the end of sub-directory names. You should see most of the following directories, plus some others:

  • /bin -- standard Unix utilities
  • /usr -- shared applications
    • /bin -- the "less commonly used" standard Unix utilities
    • /local -- local applications
  • /lib -- programming library files
  • /etc -- configuration files
  • /dev -- hardware device files
  • /tmp -- a temporary work area. Warning: Do not put any files you wish to keep in this directory!

Note: On VTAIX and BSD based Unix systems, the symbol @ is used to indicate a symbolic link. Observe here that "bin" is a symbolic link and displayed as "bin@" instead of "bin/" as it would be on many other Unix systems. Enter the command "ls -lF b*" and observe the "->" following "bin@". This symbol points to the directory /usr/bin which contains the files which are accessed whenever a reference is made to the /bin directory.

The home directories for each of the userids on the system may be included in directories called "us1", "us2", and "us3". On other Unix systems, these directories may be called home, users, or u. To return to your home directory, simply enter:


File Access Permissions

Recall that you can display the file access permissions by entering:

  ls  -l

At the beginning of each entry you will see 10 columns containing information about file characters.

  d r w x r - x r - -

The first column provides information about the file type: "d" for a directory, "l" for a symbolic link, or "-" (dash) for a regular file. The next columns contain the permission fields for user (owner), group, and other:

  • r: read
  • w: write
  • x: execute

The "read", "write", and "execute" permissions associated with a file indicate whether you can look at the contents of the file, make changes to the file, or execute the program contained in the file.

Changing File and Directory Access Permissions

You can change the current access permissions using the chmod command. The general syntax of the chmod command is given by:

  chmod ugoa±rwx  file_name


  • ugoa is: u for user or owner, g for group, o for other, a for all
  • ± is: + to add permission, - to remove it
  • rwx is: r for read, w for write, x for execute

For example, to add execute permission for owner to the file "file_name", enter:

  chmod  u+x  file_name

You can specify more than one option with the chmod command; for example, to remove read and execute permission for group and other from a file called file_name, enter:

  chmod  og-rx  file_name

Be careful how you assign access permissions. It is possible to deny yourself read, write, and execute permission while granting these permissions to group and other.You can also use numeric codes to change the current access permissions for a file. A chmod value of 1 enables execute permission, a value of 2 enables write permission, and a value of 4 enables read permission. Combinations of read, write, and execute can be obtained by adding the values corresponding to the permissions you wish to assign. For example, read and execute permission can be specified by adding the values 4 and 1 to yield 5. These codes are summarized in the following table:

  1    --x     execute only
  2    -w-     write only
  3    -wx     write and execute
  4    r--     read only
  5    r-x     read and execute
  6    rw-     read and write
  7    rwx     read, write, and execute

To change the access permissions of "file_name" to read, write, and execute for owner (4+2+1=7), with read and execute for group (4+1=5), and execute (1) only for other, enter:

  chmod  751  file_name

Then observe the results of the following commands:

  ls  -l  file_name
  cat  file_name
  chmod  a-rx  file_name
  ls  -l  f*
  chmod  a+r   file_name
  ls  -l  f*

Note: As illustrated above, it may be possible to turn on execute permission for a file; however, if the file does not contain meaningful commands, you will obtain nothing but error diagnostics when you attempt to execute it.

Setting Default Access Permissions

The umask command sets a mask which limits the access permissions assigned to new files. To display the current umask values, simply enter:


The "umask" values are complements of the chmod values: a 1 denies execute permission, a 2 denies write access, and a 4 denies read access. As with the chmodcommand, the "umask" values can be combined; e.g., read-only access (denial of execute and write permission can be specified by adding 1 and 2 to yield 3). A seven (7) denies all access permissions. To set the umask values to allow the owner read, write, and execute (0 limits) permission for all new files; to deny group write (2) access (which is equivalent to allowing read and execute permission), and to deny other read and write (2+4=6) permissions (which is equivalent to granting execute only), enter:

  umask  026

Note: The value 026 is the complement of 751 (777-026=751) used in the chmod example described in the previous section.

To set the default permission mask to allow the owner read, write, and execute capabilities and to limit group and other execute and read access, enter:

  umask  022

To set the umask for future logon sessions, include this command in the file ".profile" (Bourne or Korn Shell) or ".login" (C Shell).The following table lists some of the most commonly used umask values. In each of these cases, the owner is assigned default read, write, and execute permissions; group and other are assigned the default access permissions listed in the column labeled "group & others":

  chmod	umask	group & others

  777 000	read, write, & execute
  755 022	read & execute
  744 033	read only
  711 066	execute
  700 077	no access

The values given in the "umask" column can be obtained by subtracting the "chmod" values from "777".

Directory Access Permissions

The access permissions associated with directories influence the operations which can be performed on files they contain. The meanings of the directory access permissions are:

  • read allows display of a directory -- read permission is required in order to use ls to list characteristics of files within a directory; otherwise you will receive the message "No permission" following the name of each file in the directory.
  • execute enables access to the contents of a directory -- execute permission is required in order to cd into a directory or to access (execute or examine) any of the files it contains. Without execute permission, you will typically receive the message "Permission Denied".
  • write enables creation, deletion, and moving of files within the directory. Thus deletion of a file is limited by the permission associated with the directory and not by the individual file access permissions. Be careful to whom you provide directory write access permissions. They will not be allowed to modify the file if they do not have file write access permission, but they can remove it if they have directory write permission.

If you wish to share files with others, you need to be sure that both the permissions for the file and the directory containing it are set appropriately.

Changing Group Membership

It is possible for your userid to belong to more than one group (the list of groups and their memberships is typically contained in the file /etc/groups). On VTAIX, your userid will be listed in /etc/groups only if your userid belongs to more than one group. Use the "ls -l" command ("ls -gl" on some systems) to display a list of files and their group membership. If you would like to change the group to which an existing file is assigned, use the "chgrp" command. If you would like to change the default group used for the assignment of new files, use the "newgroup" command.

Note: On most Unix systems, you will only be able to use the chgrp and newgroup commands for groups of which you are a member.


The internal "name" used by the system for each file is its i-node number. Each directory in a Unix system is a file which lists the files it contains with their corresponding i-nodes. An i-node is a data structure which defines a file's existence and contains information about its location on disk, size, ownership, permissions, and time of last modification. To display the i-node number corresponding to file_name, enter:

  ls  -i  file_name

Observe the result of the following commands:

  ls  -i  page2
  mv  page2  new_name
  ls  -i  new_name

Although the mv command has changed the name of the file, the i-node number remains unchanged.

Locating Information

The find command can be used to locate a file or group of files. To list all files beginning in the current directory down through the directory tree which begin with the letter 'f':

  find  .  -name  'f*'  -print

The find command can also be used to display directory listings by using the "-type" option. For example, to display all directories below the current directory, enter:

  find  .  -type  d  -print

The whereis command is used to locate the binary, source, and manuals for a command. To locate the occurrence of "vi" in any of the standard locations, enter:

  whereis  vi

If an executable program is located in more than one directory, you may wish to know which of these files will be executed. To determine this, you can use thewhich command. For example, to identify the directory containing the command which will be issued when "vi" is entered, enter:

  which  vi

If a command alias has been defined, the which command will display the alias for the command.

Find Text

The grep command (Global Regular Expression Print) can be used to locate text within files. For example, to list all files in the xmp/c directory containing the word 'float', enter:

  cd     xmp/c
  grep  'float' *

To print a list of all lines in the file /etc/passwd containing the name of your userid, enter:

  grep  $USER  /etc/passwd

Note:   The above command will not yield the same result on all Unix systems; some Unix systems (such as NeXT) store their userid information in other locations.