The file utilities include programs you can use to work with files and directories in your Red Hat Linux system. Table 8-3 briefly describes each of these programs. You can copy and delete files, create new directories, and change file permissions and ownerships. You can also list directories and see the amount of disk space the files use.
Because you need to use the file utilities often, the next few sections show you how to use some of them. Also provided is a brief introduction to the find command, which enables you to locate all files that meet specified criteria.
Program |
Description |
---|---|
chgrp |
Changes group ownership of files |
chmod |
Changes the permissions of files |
chown |
Changes the ownership of files |
cp |
Copies files |
dd |
Converts a file according to a specified format and then copies the file |
df |
Shows storage space (hard disk, CD-ROM, floppy, and so on) usage for the file systems |
dir |
Prints a brief directory listing |
dircolors |
Prints the command to set the LS_COLORS environment variable, used by the color version of the GNU ls program |
du |
Shows disk space used by files and directories |
install |
Copies files and sets permissions |
ln |
Creates links between files |
ls |
Lists the contents of a directory |
mkdir |
Creates directories, if they do not already exist |
mkfifo |
Creates named pipes, used for data transfer between programs (FIFO stands for first-in first-out, which is how the named pipes transfer data) |
mknod |
Creates special block or character device files (usually located in the /dev directory) |
mv |
Renames files |
rm |
Deletes files |
rmdir |
Deletes empty directories |
shred |
Deletes a file securely by first overwriting it to make it harder to recover the data |
sync |
Flushes file system buffers to disk, thereby synchronizing memory and disk |
touch |
Changes the timestamps of files |
vdir |
Prints detailed directory listings (similar to ls -l) |
Often, you may copy files from one directory to another. Use the
cp command to perform this task. To copy the file
/usr/X11R6/lib/X11/xinit/Xclients to the
Xclients.sample file in the current directory (such as your home directory), type the following:
cp /usr/X11R6/lib/X11/xinit/Xclients Xclients.sample
If you want to copy a file to the current directory and retain the same name, use a period (
. ) as the second argument of the
cp command. Thus, the following command copies the
XF86Config file from the
/etc/X11 directory to the current directory (denoted by a single period):
cp /etc/X11/XF86Config .
The
cp command makes a new copy of a file and leaves the original intact.
If you want to copy the entire contents of a directory—including all subdirectories and their contents—to another directory, use the command
cp -ar sourcedir destdir (this copies everything under
sourcedir directory to
destdir ). For example, to copy all files from the
/etc/X11 directory to the current directory, type the following command:
cp -ar /etc/X11 .
Another GNU utility command,
mv , moves a file to a new location. The original copy is gone, and a new copy appears at the specified destination. You can use
mv to rename a file. If you want to change the name of the
today.list to
old.list , use the
mv command, as follows:
mv today.list old.list
On the other hand, if you want to move the
today.list file to a subdirectory named
saved , use this command:
mv today.list saved
An interesting feature of
mv is the fact that you can use it to move entire directories, with all their subdirectories and files, to a new location. If you have a directory named
data that contains many files and subdirectories, you can move that entire directory structure to
old_data by using the following command:
mv data old_data
Another common file operation is deleting a file. Use the
rm command to delete a file named
old.list , for example, by typing the following command:
rm old.list
Caution |
Be careful with the rm command—in particular, when you log in as root . Inadvertently deleting important files with rm is very common. One way to avoid problems is to add the command alias rm='rm -i' to the .bash_profile file in your home directory. With that in place, whenever you use the rm command to delete a file, the command first asks for confirmation. |
To organize files in your home directory, you have to create new directories. Use the
mkdir command to create a directory. For example, to create a directory named
images in the current directory, type the following:
mkdir images
After you create the directory, you can type the
cd images command to change to that directory.
You can create an entire directory tree by using the
-p option of the
mkdir command. For example, suppose that your system has a
/usr/src directory and you want to create the directory tree
/usr/src/book/java/examples/applets . You can create this directory hierarchy by typing the following command:
mkdir -p /usr/src/book/java/examples/applets
When you no longer need a directory, use the
rmdir command to delete it. You can delete a directory only when the directory is empty.
To remove an empty directory tree, you can use the –p option, like this:
rmdir -p /usr/src/book/java/examples/applets
This command removes the empty parent directories of
applets . The command stops when it encounters a directory that’s not empty.
The
dd command is useful for copying binary data to a floppy disk (or to other devices, such as tape). For example, if you want to make a Red Hat boot disk on a Linux system, you can use the
dd command to prepare the boot disk before you install Red Hat Linux from this book’s companion CD-ROMs. Perform the following steps to prepare the boot disk:
Log in as
root and mount the first CD from this book’s companion CD-ROMs on
/mnt/cdrom (type mount /mnt/cdrom). Change to the directory with the boot images as follows:
cd /mnt/cdrom/images
Place a formatted floppy disk in the floppy drive, then type the following command to copy the
bootdisk.img file to the floppy disk:
dd if=bootdisk.img of=/dev/fd0 bs=1440k
If you want to copy another boot image to the floppy, replace
bootdisk.img with that file’s name.
Two programs in the GNU file utilities—
df and
du —enable you to check disk-space usage. These commands are simple to use. The
df command shows you a summary of disk-space usage for all mounted devices, as shown in the following example:
df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda5 7392428 3412688 3604224 49% / /dev/hda3 101107 8865 87021 10% /boot none 127328 0 127328 0% /dev/shm /dev/cdrom 75322 75322 0 100% /mnt/cdrom
The output is a table that shows the device, the total kilobytes of storage, how much is in use, how much is available, the percentage being used, and the mount point. For example, on my system, the
/dev/hda5 device (a disk partition) is mounted on the Linux file system’s root directory; it has about 7.4GB of space, of which 3.4GB (or 49 percent) is being used, and 3.6GB is available. Similarly, you can see from the last line that the CD-ROM has about 75MB of storage in use.
The other command,
du , is useful for finding out how much space a directory is using. For example, type the following command to view the contents of all the subdirectories in the
/var/log directory (this directory contains various error logs):
du /var/log 4 /var/log/vbox 12528 /var/log/cups 4 /var/log/samba 4 /var/log/news/OLD 8 /var/log/news 60 /var/log/httpd 4 /var/log/squid 36 /var/log/gdm 14764 /var/log
Each directory name is preceded by a number—that number denotes the number of kilobytes of disk space that directory uses. Thus, the
/var/log directory, as a whole, uses 14764KB, or about 14.7MB, of disk space, whereas the
/var/log/httpd subdirectory uses 60KB.
You can use the
-h option with the
du command to view the disk-space usage in human-readable format. For example, here’s what you get when you type du -h /var/log to view the disk space used by the
/var/log directory and its contents:
du -h /var/log 4.0K /var/log/vbox 13M /var/log/cups 4.0K /var/log/samba 4.0K /var/log/news/OLD 8.0K /var/log/news 60K /var/log/httpd 4.0K /var/log/squid 36K /var/log/gdm 15M /var/log
If you simply want the total disk space a directory uses (including all the files and subdirectories contained in that directory), use the
-s option together with the
-h option, as follows:
du -sh /var/log 15M /var/log
Notice that the
-s option causes
du to print just the summary information for the
/var/log directory.
The
find command is very useful for locating files (and directories) that meet specified search criteria. The Linux version of the find command also comes from GNU, and it has more extensive options than the standard UNIX version. I show the syntax for the standard UNIX find command, however, because it syntax works in GNU find, and you can use the same format on other UNIX systems.
I must admit that when I began using UNIX many years ago (Berkeley UNIX in the early 1980s), I was confounded by the
find command. I stayed with one basic syntax of
find for a long time before graduating to more complex forms. The basic syntax I learned first was for finding a file anywhere in the file system.
Suppose that you want to find any file or directory with a name that starts with gnome. You can use find to perform this search, as follows:
find / -name "gnome*" -print
This command tells find to start looking at the root directory (
/ ), to look for filenames that match
gnome* , and to display the full pathname of any matching file.
You can use variations of this simple form of find to locate a file in any directory (as well as any subdirectories contained in the directory). If you forget where in your home directory you have stored all files named
report* (names that start with the text string
report ), you can search for the files by using the following command:
find ~ -name "report*" -print
When you become comfortable with this syntax of
find , you can use other options of
find . For example, to find only specific types of files (such as directories), use the
-type option. The following command displays all top-level directory names in your Linux system:
find / -type d -maxdepth 1 -print
To find all files that exceed 20,000KB (20MB) in size, you can use the following
find command:
find / -size +20000k -print
You can also execute some command [i1]on a file after you find it. For example, suppose that you want to search for the files that exceed 20,000KB in size and then print a detailed directory listing of that file. You can use the
-exec operator of
find to execute the
ls -l command on each file that matches the search criteria, like this:
find / -size +20000k -exec ls -l {} \;
The
-exec operator enables you to run any command on the files that meet whatever search criteria you use with
find . You can type the command to execute following the
-exec operator, then list any arguments, and end the list with a semicolon (
; ). However, the shell treats semicolon as command-separator, so you must place a backslash (
\ ) in front of the semicolon to stop the shell from interpreting it. That’s why every
-exec operator ends with the characters
\; . The curly brace pair
{} is also has special meaning. The
find command replaces the characters
{} with the name of the file it has found—the file that satisfies whatever search criteria you have provided.
Another good use of
find ’s
-exec operator is to find the files with permission settings that may be too dangerous and then change the permission by using the
chmod command. For example, suppose you want to locate any file with a group-write permission (that means the group owner is allowed to alter the file) and take away that permission. Here is a
find command that uses the
-exec operator to accomplish this task:
find / -perm -20 -exec chmod g-w {} \;
You probably do not have to use the complex forms of
find very often in a typical Linux system, but you can look up the rest of the find options by using the following command:
man find