|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. # (http://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
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",  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.
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.