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

26.6.4 ファイル属性

本節では、所有者およびグループ番号、名前の数、inode番号、サイズ、ならびにアクセス時刻と変更時刻など、ファイルに関する詳細情報を取得するための関数について説明します。

関数: file-newer-than-file-p filename1 filename2

この関数は、ファイル filename1 がファイル filename2 よりも新しい場合に t を返します。filename1 が存在しない場合は、nil を返します。filename1 は存在するが filename2 が存在しない場合は、t を返します。それ以外の場合は、各ファイルの最終更新日時を比較します。

以下の例では、ファイル aug-19 が19日に、aug-20 が20日に書き込まれ、ファイル no-file は全く存在しないものとします。

(file-newer-than-file-p "aug-19" "aug-20")
     ⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
     ⇒ t
(file-newer-than-file-p "aug-19" "no-file")
     ⇒ t
(file-newer-than-file-p "no-file" "aug-19")
     ⇒ nil
関数: file-has-changed-p filename tag

この関数は、前回の呼び出し以降に filename のタイムスタンプが変更された場合、nil 以外の値を返します。ある filename に対して初めて呼び出された際は、ファイルの最終変更時刻とサイズを記録し、filename が存在する場合は nil 以外の値を返します。その後、同じ filename に対して呼び出された際は、現在のタイムスタンプとサイズを記録済みのものと比較し、タイムスタンプまたはサイズ(あるいはその両方)が異なる場合にのみ nil 以外の値を返します。これは、Lisp プログラムがファイルの変更時にその都度再読み込みを行いたい場合に有用です。シンボルである必要があるオプション引数 tag を指定すると、サイズおよび変更時刻の比較は、同一のタグを持つ呼び出しに限定されます。

関数: file-attributes filename &optional id-format

この関数は、ファイル filename の属性リストを返します。指定したファイルが存在しない場合は、nil を返します。この関数はシンボリックリンクを辿りません。オプションパラメータ id-format は、属性 UID および GID の優先フォーマットを指定します(後述)—有効な値は 'string と 'integer です。後者がデフォルトですが、変更を予定しているため、返された UID または GID を使用する場合は、id-format に nil 以外の値を指定してください。

GNUプラットフォーム上でローカルファイルを操作する場合、この関数はアトミックです。つまり、他のプロセスによってファイルシステムが同時に変更されている場合、この関数は変更前または変更後のいずれかのファイル属性を返します。それ以外の場合、この関数はアトミックではなく、競合状態を検出した際に nil を返したり、以前と現在のファイル属性が混在した状態を返したりすることがあります。

このリスト内の要素にアクセスするためのアクセサ関数が用意されています。これらのアクセサについては、以下で各要素の説明とともに記載します。

リストの要素は、順に以下の通りです:

  1. ディレクトリの場合は t、シンボリックリンク(リンク先の名前)の場合は文字列、テキストファイル(file-attribute-type)の場合は nil。
  2. ファイルに含まれる名前の数 (file-attribute-link-number)。ハードリンクとしても知られる別名は、add-name-to-file 関数を使用して作成できます(ファイル名と属性の変更を参照)。
  3. ファイルのUIDは、通常は文字列(file-attribute-user-id)となります。ただし、名前付きユーザーに対応しない場合は、値は整数となります。
  4. ファイルのGIDも同様に(file-attribute-group-id)。
  5. 最終アクセス時刻をLispのタイムスタンプ(file-attribute-access-time)として表したものです。このタイムスタンプはcurrent-time形式(Time of Dayを参照)であり、ファイルシステムのタイムスタンプ分解能に合わせて切り捨てられます。例えば、一部のFATベースのファイルシステムでは最終アクセス日のみが記録されるため、この時刻は常に最終アクセス日の午前0時となります。
  6. 最終更新日時(Lispタイムスタンプ形式、file-attribute-modification-time)。これは、ファイルの内容が最後に変更された時刻です。
  7. 前回のステータス変更時刻をLispのタイムスタンプ(file-attribute-status-change-time)で表したものです。これは、ファイルの内容以外に、ファイルのアクセスモードビット、所有者およびグループ、ならびにファイルシステムに記録されているその他の情報が最後に変更された時刻です。
  8. ファイルのサイズ(バイト単位)(file-attribute-size)。
  9. ファイルのモードは、「ls -l」(file-attribute-modes)のように、10文字の英字またはハイフンからなる文字列で表されます。
  10. 後方互換性のために用意された未指定の値。
  11. ファイルのinode番号(file-attribute-inode-number)は、非負整数です。
  12. ファイルが配置されているデバイスのファイルシステム識別子(file-attribute-device-number)で、整数または2つの整数からなるコンスセルです。後者は、リモートファイルシステムをローカルのものと区別するために、リモートファイルで使用されることがあります。

ファイルのinodeとデバイスを合わせることで、システム上の任意の2つのファイルを区別するのに十分な情報が得られます。これら2つの属性の値が完全に一致するファイルは存在しません。ファイルを一意に識別するこのタプルは、file-attribute-file-identifierによって返されます。

例えば、files.texi のファイル属性は以下の通りです。

(file-attributes "files.texi" 'string)
     ⇒  (nil 1 "lh" "users"
          (20614 64019 50040 152000)
          (20000 23 0 0)
          (20614 64555 902289 872000)
          122295 "-rw-rw-rw-"
          t 6473924464520138
          1014478468)

そして、結果の解釈は以下の通りです。

nil

ディレクトリでもシンボリックリンクでもありません。

1

名前は1つのみです(現在のデフォルトディレクトリにあるfiles.texiという名前)。

"lh"

‘lh’という名前のユーザーが所有しています。

"users"

‘users’という名前のグループに属しています。

(1351023123050040152 . 1000000000)

最終アクセス日時は2012年10月23日 20:12:03.050040152 UTCです。 (current-time-listがtの場合、このタイムスタンプは(20614 64019 50040 152000)となります。)

(1310720023000000000 . 1000000000)

最終更新日時は2001年7月15日 08:53:43.000000000 UTCです。 (current-time-listがtの場合、このタイムスタンプは(20000 23 0 0)となります。)

(1351023659902289872 . 1000000000)

最終更新日時は2012年10月23日 20:20:59.902289872 UTCです。 (current-time-listがtの場合、このタイムスタンプは(20614 64555 902289 872000)となります。)

122295

長さは122295バイトです。(ただし、一部のバイトがマルチバイトシーケンスに属している場合や、行末形式がCR-LFである場合には、122295文字含まれないことがあります。)

"-rw-rw-rw-"

所有者、グループ、およびワールドに対する読み書きアクセスモードを備えています。

t

単なるプレースホルダーであり、情報は一切含まれていません。

6473924464520138

inode番号は6473924464520138です。

1014478468

は、番号が1014478468のファイルシステムデバイス上にあります。

この関数は、ファイル filename が持つ名前(すなわちハードリンク)の数を返します。ファイルが存在しない場合、この関数は nil を返します。なお、シンボリックリンクはリンク先のファイルの名前とはみなされないため、この関数には影響しません。この関数はシンボリックリンクを辿りません。

$ ls -l foo*
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1

(file-nlinks "foo")
     ⇒ 2
(file-nlinks "doesnt-exist")
     ⇒ nil