The first commands a novice learns
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 useful options are -S, sort listing by file size, -t, sort by file modification time, and -i, show file inodes (see Example 12-4).
Example 12-1. Using ls to create a table of contents for burning a CDR disk
#!/bin/bash # burn-cd.sh # Script to automate burning a CDR. SPEED=2 # May use higher speed if your hardware supports it. IMAGEFILE=cdimage.iso CONTENTSFILE=contents DEVICE=cdrom # DEVICE="0,0" for older versions of cdrecord DEFAULTDIR=/opt # This is the directory containing the data to be burned. # Make sure it exists. # Exercise: Add a test for this. # Uses Joerg Schilling's "cdrecord" package: # http://www.fokus.fhg.de/usr/schilling/cdrecord.html # If this script invoked as an ordinary user, need to suid cdrecord #+ chmod u+s /usr/bin/cdrecord, as root. # Of course, this creates a security hole, though a relatively minor one. if [ -z "$1" ] then IMAGE_DIRECTORY=$DEFAULTDIR # Default directory, if not specified on command line. else IMAGE_DIRECTORY=$1 fi # Create a "table of contents" file. 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." # Create an image file preparatory to burning it onto the CDR. mkisofs -r -o $IMAGEFILE $IMAGE_DIRECTORY echo "Creating ISO9660 file system image ($IMAGEFILE)." # Burn the CDR. cdrecord -v -isosize speed=$SPEED dev=$DEVICE $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.
# Uses of 'cat' cat filename # Lists the file. cat file.1 file.2 file.3 > file.123 # Combines three files into one. |
See also Example 12-24 and Example 12-20.
In a pipe, it may be more efficient to redirect the stdin to a file, rather than to cat the file.
|
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-6).
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-17 and Example A-3.
When used in a non-interactive script, mv takes the -f (force) option to bypass user input. When a directory is moved to a preexisting directory, it becomes a subdirectory of the destination directory.
|
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.
The rm command will, by itself, fail to remove filenames beginning with a dash.
The way to accomplish this is to preface the filename to be removed with a dot-slash .
|
When used with the recursive flag -r, this command removes files all the way down the directory tree from the current directory. |
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. For example, 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-11).
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. A "link" is a reference to a file, an alternate name for it. The ln command permits referencing the linked file by more than one name and is a superior alternative to aliasing (see Example 4-6).
The ln creates only a reference, a pointer to the file only a few bytes in size.
The ln command is most often used with the -s, symbolic or "soft" link flag. An advantage of using the -s flag is that it permits linking across file systems.
The syntax of the command is a bit tricky. For example: ln -s oldfile newfile links the previously existing oldfile to the newly created link, newfile.
If a file named newfile has previously existed, it will be deleted when the filename newfile is preempted as the name for a link. |
Links give the ability to invoke a script (or any other type of executable) with multiple names, and having that script behave according to how it was invoked.
Example 12-2. Hello or Good-bye
#!/bin/bash # hello.sh: Saying "hello" or "goodbye" #+ depending on how script is invoked. # Make a link in current working directory ($PWD) to this script: # ln -s hello.sh goodbye # Now, try invoking this script both ways: # ./hello.sh # ./goodbye HELLO_CALL=65 GOODBYE_CALL=66 if [ $0 = "./goodbye" ] then echo "Good-bye!" # Some other goodbye-type commands, as appropriate. exit $GOODBYE_CALL fi echo "Hello!" # Some other hello-type commands, as appropriate. exit $HELLO_CALL |
These commands access the manual and information pages on system commands and installed utilities. When available, the info pages usually contain a more detailed description than do the man pages.
[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. |