Advanced Bash-Scripting Guide: An in-depth exploration of the art of shell scripting | ||
---|---|---|
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 your hardware supports it. IMAGEFILE=cdimage.iso CONTENTSFILE=contents DEFAULTDIR=/opt # Make sure this directory exists. # 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 |
See also Example 12-21 and Example 12-17.
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-15 and Example A-3.
When used in a non-interactive script, mv takes the -f (force) option to bypass user input. |
Delete (remove) a file or files. The -f option forces removal of even readonly files, and is useful for bypassing user input in a script.
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. |