Next: File Attributes, Previous: Kinds of Files, Up: Information about Files
The truename of a file is the name that you get by following symbolic links at all levels until none remain, then simplifying away `.' and `..' appearing as name components. This results in a sort of canonical name for the file. A file does not always have a unique truename; the number of distinct truenames a file has is equal to the number of hard links to the file. However, truenames are useful because they eliminate symbolic links as a cause of name variation.
The function
file-truenamereturns the truename of the file filename. The argument must be an absolute file name.This function does not expand environment variables. Only
substitute-in-file-namedoes that. See Definition of substitute-in-file-name.If you may need to follow symbolic links preceding `..' appearing as a name component, you should make sure to call
file-truenamewithout prior direct or indirect calls toexpand-file-name, as otherwise the file name component immediately preceding `..' will be “simplified away” beforefile-truenameis called. To eliminate the need for a call toexpand-file-name,file-truenamehandles `~' in the same way thatexpand-file-namedoes. See Functions that Expand Filenames.
This function follows symbolic links, starting with filename, until it finds a file name which is not the name of a symbolic link. Then it returns that file name. This function does not follow symbolic links at the level of parent directories.
If you specify a number for limit, then after chasing through that many links, the function just returns what it has even if that is still a symbolic link.
To illustrate the difference between file-chase-links and
file-truename, suppose that /usr/foo is a symbolic link to
the directory /home/foo, and /home/foo/hello is an
ordinary file (or at least, not a symbolic link) or nonexistent. Then
we would have:
(file-chase-links "/usr/foo/hello")
;; This does not follow the links in the parent directories.
⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
;; Assuming that /home is not a symbolic link.
⇒ "/home/foo/hello"
See Buffer File Name, for related information.
