| Advanced Bash-Scripting Guide: A complete guide to shell scripting, using Bash | ||
|---|---|---|
| Prev | Chapter 12. External Filters, Programs and Commands | Next | 
The basic file "list" command. It is all too easy to underestimate the power of this humble command. For example, using the -R, recursive option, ls provides a tree-like listing of a directory structure. Other interesting options are -S, sort listing by file size, -t, sort by file modification time, and -i, show file inodes (see Example 12-3).
Example 12-1. Using ls to create a table of contents for burning a CDR disk
#!/bin/bash
SPEED=2    # May use higher speed if supported.
IMAGEFILE=cdimage.iso
CONTENTSFILE=contents
DEFAULTDIR=/opt
# Script to automate burning a CDR.
# Uses Joerg Schilling's "cdrecord" package.
# (https://www.fokus.gmd.de/nthp/employees/schilling/cdrecord.html)
# If this script invoked as an ordinary user, need to suid cdrecord
# (chmod u+s /usr/bin/cdrecord, as root).
if [ -z "$1" ]
then
  IMAGE_DIRECTORY=$DEFAULTDIR
  # Default directory, if not specified on command line.
else
    IMAGE_DIRECTORY=$1
fi
    
ls -lRF $IMAGE_DIRECTORY > $IMAGE_DIRECTORY/$CONTENTSFILE
# The "l" option gives a "long" file listing.
# The "R" option makes the listing recursive.
# The "F" option marks the file types (directories get a trailing /).
echo "Creating table of contents."
mkisofs -r -o $IMAGFILE $IMAGE_DIRECTORY
echo "Creating ISO9660 file system image ($IMAGEFILE)."
cdrecord -v -isosize speed=$SPEED dev=0,0 $IMAGEFILE
echo "Burning the disk."
echo "Please be patient, this will take a while."
exit 0 | 
cat, an acronym for concatenate, lists a file to stdout. When combined with redirection (> or >>), it is commonly used to concatenate files.
cat filename cat file.1 file.2 file.3 > file.123  | 
See also Example 12-20 and Example 12-16.
tac, is the inverse of cat, listing a file backwards from its end.
reverses each line of a file, and outputs to stdout. This is not the same effect as tac, as it preserves the order of the lines, but flips each one around.
bash$ cat file1.txt This is line 1. This is line 2. bash$ tac file1.txt This is line 2. This is line 1. bash$ rev file1.txt .1 enil si sihT .2 enil si sihT  | 
This is the file copy command. cp file1 file2 copies file1 to file2, overwriting file2 if it already exists (see Example 12-5).
![]()  | Particularly useful are the -a archive flag (for copying an entire directory tree) and the -r and -R recursive flags.  | 
This is the file move command. It is equivalent to a combination of cp and rm. It may be used to move multiple files to a directory, or even to rename a directory. For some examples of using mv in a script, see Example 9-12 and Example A-3.
Delete (remove) a file or files. The -f forces removal of even readonly files.
![]()  | When used with the recursive flag -r, this command removes files all the way down the directory tree.  | 
Remove directory. The directory must be empty of all files, including invisible "dotfiles", [1] for this command to succeed.
Make directory, creates a new directory. mkdir -p project/programs/December creates the named directory. The -p option automatically creates any necessary parent directories.
Changes the attributes of an existing file (see Example 11-8).
chmod +x filename # Makes "filename" executable for all users. chmod u+s filename # Sets "suid" bit on "filename" permissions. # An ordinary user may execute "filename" with same privileges as the file's owner. # (This does not apply to shell scripts.)  | 
chmod 644 filename # Makes "filename" readable/writable to owner, readable to # others # (octal mode).  | 
chmod 1777 directory-name # Gives everyone read, write, and execute permission in directory, # however also sets the "sticky bit". # This means that only the owner of the directory, # owner of the file, and, of course, root # can delete any particular file in that directory.  | 
Change file attributes. This has the same effect as chmod above, but with a different invocation syntax, and it works only on an ext2 filesystem.
Creates links to pre-existings files. Most often used with the -s, symbolic or "soft" link flag. This permits referencing the linked file by more than one name and is a superior alternative to aliasing (see Example 5-6).
ln -s oldfile newfile links the previously existing oldfile to the newly created link, newfile.
| [1] | These are files whose names begin with a dot, such as ~/.Xdefaults. Such filenames do not show up in a normal ls listing, and they cannot be deleted by an accidental rm -rf *. Dotfiles are generally used as setup and configuration files in a user's home directory.  |