10.2. What's Really in a Directory?
Before you can understand
moving and copying files, you need to know a bit more about how files
are represented in directories. What does it mean to say that a file
is really "in" a directory?
It's easy to imagine that files are actually inside
of something (some special chunk of the disk that's
called a directory). But that's precisely wrong, and
it's one place where the filing cabinet model of a
filesystem doesn't apply.
A directory really is just another file, and it really
isn't different from any other datafile. If you want
to prove this, try the command od -c
. On some Unix
systems, it dumps the current directory to the screen in raw form.
The result certainly looks ugly (it's not a text
file; it just has lots of binary characters). But, if your system
allows it, od
-c should let you
see the names of the files that are in the current directory [and,
probably, some names of files that have been deleted! Sorry,
they're only the old directory entries; you
can't get the files back
-- JP]. If od
-c .
doesn't work (and it won't on
current versions of Linux, for example), use ls
-if instead.
A directory is really
just a list of files represented by filenames and inode numbers, as
shown in the output in Example 10-1.
Example 10-1. Directory-content visualization
The file named . is inode 34346
The file named .. is inode 987
The file named mr.ed is inode 10674
The file named joe.txt is inode 8767
The file named grok is inode 67871
The file named otherdir is inode 2345
When you give a filename like grok, the kernel
looks up grok in the current directory and finds
out that this file has inode 67871; it then looks up this inode to
find out who owns the file, where the data blocks are, and so on.
What's more, some of these
"files" may be directories in their
own right. In particular, that's true of the first
two entries: . and ... These
entries are in every directory. The
current
directory is represented by ., while
.. refers to the
"parent" of the current directory
(i.e., the directory that
"contains" the current directory).
The file otherdir is yet another directory that
happens to be "within" the current
directory. However, there's no way you can tell that
from its directory entry -- Unix doesn't know
it's different until it looks up its inode.
Now that you know what a directory is, think about some basic
directory operations. What does it mean to move, or rename, a file?
If the file is staying in the same directory, the
mv command just changes the
file's name in the directory; it
doesn't touch the data at all.
Moving a file into another directory
takes a little more work, but not much. A command like mv
dir1/foo dir2/foo means "delete
foo's entry in
dir1 and create a new entry for
foo in
dir2." Again, Unix
doesn't have to touch the data blocks or the inode
at all.
The only time you actually need to
copy data is if you're moving a file into another
filesystem. In that case, you have to copy the file to the new
filesystem; delete its old directory entry; return the
file's data blocks to the "free
list," which means that they can be reused; and so
on. It's a fairly complicated operation, but (still)
relatively rare. (On some old versions of Unix,
mv wouldn't let you move files
between filesystems. You had to copy it and remove the old file by
hand.)
How does Unix find out the name of the current directory? In Example 10-1 there's an entry for
., which tells you that the current directory has
inode 34346. Is the directory's name part of the
inode? Sorry -- it isn't. The
directory's name is included in the parent
directory. The parent directory is .., which is
inode 987. So Unix looks up inode 987, finds out where the data is,
and starts reading every entry in the parent directory. Sooner or
later, it will find one that corresponds to inode 34346. When it does
that, it knows that it has found the directory entry for the current
directory and can read its name.
Complicated? Yes, but if you understand this, you have a pretty good
idea of how Unix directories work.
-- ML
 |  |  | 10. Linking, Renaming, and Copying Files |  | 10.3. Files with Two or More Names |
Copyright © 2003 O'Reilly & Associates. All rights reserved.
|