GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Kinds-of-Files.html ・ emacs-doc.conao3.com

26.6.2 ファイル種類の区別

本節では、ディレクトリ、シンボリックリンク、通常ファイルなど、さまざまな種類のファイルを区別する方法について説明します。

シンボリックリンクは通常、出現する箇所であればどこでも辿られます。例えば、ファイル名 a/b/c を解釈する場合、a、a/b、a/b/c のいずれかがシンボリックリンクである可能性があり、それらが辿られます。また、リンク先自体がシンボリックリンクである場合は、再帰的に辿られることもあります。ただし、ファイル名の末尾にあるシンボリックリンクを辿らない関数も少数存在します(この例では a/b/c)。このような関数は、シンボリックリンクを辿らないと言われます。

ファイル filename がシンボリックリンクである場合、この関数はリンク先を辿らず、代わりにそのリンク先を文字列として返します。(リンク先の文字列は、必ずしもリンク先の完全な絶対ファイル名であるとは限りません。リンクが指す完全なファイル名を特定することは容易ではありません。詳細は後述します。)

ファイル filename がシンボリックリンクでないか、存在しないか、あるいはシンボリックリンクであるかどうかの判定に問題が生じた場合、file-symlink-p は nil を返します。

この関数の使用例をいくつか挙げます。

(file-symlink-p "not-a-symlink")
     ⇒ nil
(file-symlink-p "sym-link")
     ⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
     ⇒ "sym-link"
(file-symlink-p "/bin")
     ⇒ "/pub/bin"

なお、3番目の例では、関数は sym-link を返しましたが、そのファイル自体がシンボリックリンクであるにもかかわらず、その解決までは行いませんでした。これは、この関数がシンボリックリンクを辿らないためです—シンボリックリンクを辿る処理は、ファイル名の最後の構成要素には適用されません。

この関数が返す文字列がシンボリックリンクに記録される内容であり、先頭のディレクトリが含まれる場合と含まれない場合があります。この関数はリンクターゲットを展開して完全修飾ファイル名を生成することはせず、特にリンクターゲットが絶対ファイル名でない場合には、filename引数の先頭ディレクトリ(もしあれば)も使用しません。以下に例を示します:

(file-symlink-p "/foo/bar/baz")
     ⇒ "some-file"

ここでは、/foo/bar/baz を完全修飾ファイル名として指定しましたが、結果はそうなっておらず、実際には先頭のディレクトリが一切付いていません。また、some-file 自体がシンボリックリンクである可能性があるため、単に先頭にディレクトリを付加することもできませんし、単純に expand-file-name (ファイル名を展開する関数 を参照)を用いてその絶対ファイル名を生成することもできません。

このため、ファイルがシンボリックリンクであるか否かという事実以上の情報を判断する必要がある場合、この関数が役立つことは滅多にありません。実際にリンク先のファイル名が必要な場合は、Truenamesで説明されているfile-chase-linksまたはfile-truenameを使用してください。

関数: file-directory-p filename

この関数は、filename が既存のディレクトリ名である場合に t を返します。filename がディレクトリ名ではない場合、またはディレクトリであるかどうかの判定に問題が生じた場合には、nil を返します。この関数はシンボリックリンクを辿ります。

(file-directory-p "~rms")
     ⇒ t
(file-directory-p "~rms/lewis/files.texi")
     ⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
     ⇒ nil
(file-directory-p "$HOME")
     ⇒ nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     ⇒ t
関数: file-regular-p filename

この関数は、ファイル filename が存在し、かつ通常ファイル(ディレクトリ、名前付きパイプ、端末、その他の I/O デバイスではない)である場合に t を返します。filename が存在しないか、通常ファイルではない場合、あるいは通常ファイルであるかどうかの判定に問題が生じた場合には、nil を返します。この関数はシンボリックリンクを辿ります。