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.
Copyright © 2003 O'Reilly & Associates. All rights reserved.