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

26.7 ファイル名と属性の変更

本セクションの関数は、ファイルの名前変更、コピー、削除、リンク、およびモード(権限)の設定を行います。通常、これらの関数は処理に失敗した場合に file-error エラーを返し、失敗の原因を説明するシステム固有のエラーメッセージを報告します。ファイルが存在しないために失敗した場合は、代わりに file-missing エラーを返します。

パフォーマンス向上のため、オペレーティングシステムは、これらの関数による変更内容を直ちに二次記憶装置に書き込むのではなく、キャッシュしたりエイリアス化したりすることがあります。ファイルと二次記憶装置を参照してください。

引数 newname を持つ関数において、この引数がディレクトリ名である場合、ソース名のディレクトリ以外の部分が付加されたものとして扱われます。通常、ディレクトリ名とは末尾が ‘/’ で終わるものを指します(ディレクトリ名を参照)。例えば、旧名が a/b/c である場合、newname d/e/f/ は d/e/f/c であるかのように扱われます。この特別な処理は、newname がディレクトリ名ではなく、ディレクトリであるファイルを指定している場合には適用されません。例えば、d/e/f がディレクトリであっても、newname d/e/f はそのまま保持されます。

引数 newname を持つ関数において、newname という名前のファイルが既に存在する場合、実行される処理は引数 ok-if-already-exists の値によって異なります:

コマンド: add-name-to-file oldname newname &optional ok-if-already-exists

この関数は、oldname という名前のファイルに newname という追加名を付与します。これにより、newname は oldname への新しいハードリンクとなります。

newname がシンボリックリンクの場合、置き換えられるのはそのディレクトリエントリであり、リンク先のディレクトリエントリではありません。oldname がシンボリックリンクの場合、この関数はリンクを辿る場合と辿らない場合があり、GNU プラットフォームではリンクを辿りません。oldname がディレクトリの場合、この関数は通常失敗しますが、一部の旧式な非 GNU プラットフォームのスーパーユーザーであれば成功し、ツリー構造を持たないファイルシステムを作成することがあります。

以下の例の前半部分では、foo と foo3 という2つのファイルを列挙しています。

$ ls -li fo*
81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

次に、add-name-to-fileを呼び出してハードリンクを作成し、再度ファイルを一覧表示します。これにより、1つのファイルに対してfooとfoo2という2つの名前が表示されます。

(add-name-to-file "foo" "foo2")
     ⇒ nil

$ ls -li fo*
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

最後に、以下を評価します。

(add-name-to-file "foo" "foo3" t)

そして、再度ファイルを一覧表示します。これで、1つのファイルに対して foo、foo2、foo3 という3つの名前がある状態になります。foo3 の元の内容は失われます。

(add-name-to-file "foo1" "foo3")
     ⇒ nil

$ ls -li fo*
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3

この関数は、1つのファイルに対して複数の名前が許可されていないオペレーティングシステムでは意味をなしません。システムによっては、代わりにファイルをコピーすることで複数の名前を実現しています。

ファイル属性のfile-nlinksも参照してください。

コマンド: rename-file filename newname &optional ok-if-already-exists

このコマンドは、ファイル filename を newname にリネームします。

filename に filename 以外の名前がある場合、それらの名前は引き続き保持されます。実際、add-name-to-file と共に newname という名前を追加し、その後 filename を削除することは、一時的な中間状態やエラー処理、ディレクトリおよびシンボリックリンクを除けば、名前の変更と同じ効果をもたらします。

このコマンドはシンボリックリンクを辿りません。filename がシンボリックリンクの場合、このコマンドはリンク先のファイルではなく、シンボリックリンク自体の名前を変更します。newname がシンボリックリンクの場合、リンク先のディレクトリエントリではなく、そのディレクトリエントリ自体が置き換えられます。

filename と newname が同一のディレクトリエントリである場合(すなわち、同一の親ディレクトリを参照し、そのディレクトリ内で同じ名前を持つ場合)、このコマンドは何も行いません。それ以外の場合で、filename と newname が同一のファイルを指しているなら、POSIX準拠のシステムではこのコマンドは何も行わず、一部の非POSIXシステムでは filename を削除します。

newname が存在する場合、oldname がディレクトリであれば空ディレクトリでなければならず、そうでなければディレクトリではない。

コマンド: copy-file oldname newname &optional ok-if-already-exists time preserve-uid-gid preserve-permissions

このコマンドは、ファイル oldname を newname にコピーします。oldname が通常ファイルでない場合は、エラーが報告されます。newname がディレクトリを指定している場合は、oldname をそのディレクトリにコピーし、末尾の名前コンポーネントを保持します。

この関数はシンボリックリンクを辿りますが、newname を作成するためのダングリング・シンボリックリンクは辿りません。

time が nil 以外の場合、この関数は新しいファイルに、元のファイルと同じ最終更新日時を設定します。(これは一部のオペレーティングシステムでのみ動作します。)時刻の設定でエラーが発生した場合、copy-file は file-date-error エラーを示します。対話的な呼び出しでは、接頭辞引数によって time に nil 以外の値を指定します。

引数 preserve-uid-gid が nil の場合、新規ファイルのユーザーおよびグループの所有権はオペレーティングシステムに委ねられます(通常は Emacs を実行しているユーザーに設定されます)。preserve-uid-gid が nil 以外の場合、ファイルのユーザーおよびグループの所有権をコピーしようと試みます。これは一部のオペレーティングシステムでのみ動作し、また適切な権限がある場合にのみ可能です。

オプション引数 preserve-permissions が nil 以外の場合、この関数は oldname のファイルモード(または「パーミッション」)に加え、アクセス制御リストおよび SELinux コンテキスト(存在する場合)を newname にコピーします。ファイルに関する情報 を参照してください。

それ以外の場合、newname のファイルモードは、既存ファイルであれば変更されず、newname を新たに作成する場合は、デフォルトのファイル権限(後述の set-default-file-modes を参照)でマスクされた oldname のモードに設定されます。いずれの場合も、アクセス制御リストや SELinux コンテキストはコピーされません。

このコマンドは、target へのシンボリックリンクを linkname という名前で作成します。これはシェルコマンド ‘ln -s target linkname’ と同様です。引数 target は単なる文字列として扱われ、既存のファイル名である必要はありません。ok-if-already-exists が対話的使用を示す整数である場合、target 文字列内では先頭の ‘~’ が展開され、先頭の ‘/:’ が削除されます。

target が相対ファイル名である場合、生成されるシンボリックリンクは、そのシンボリックリンクが含まれるディレクトリを基準として解釈されます。絶対ファイル名と相対ファイル名を参照してください。

target と linkname の両方がリモートファイル名の構文を持ち、かつ両方のリモート識別子が等しい場合、シンボリックリンクは target のローカルファイル名部分を指します。

この関数は、シンボリックリンクをサポートしていないシステムでは利用できません。

コマンド: delete-file filename &optional trash

このコマンドはファイル filename を削除します。ファイルに複数の名前がある場合、他の名前では引き続き存在します。filename がシンボリックリンクである場合、delete-file はシンボリックリンクのみを削除し、そのリンク先は削除しません。

filename を削除できない場合、このコマンドは適切な種類の file-error エラーを通知します。(GNU やその他の POSIX 準拠システムでは、ディレクトリが書き込み可能であればファイルを削除できます。)ファイルが存在しない場合、このコマンドはエラーを通知しません。

オプション引数 trash が nil 以外で、変数 delete-by-moving-to-trash が nil 以外の場合、このコマンドはファイルを削除せずにシステムのゴミ箱に移動します。The GNU Emacs Manual の Miscellaneous File Operations を参照してください。対話的に呼び出された場合、接頭辞引数が指定されていなければ trash は t となり、指定されていれば nil となります。

ディレクトリの作成、コピー、削除 の delete-directory も参照してください。

ユーザーオプション: remote-file-name-inhibit-delete-by-moving-to-trash

この変数が nil 以外の場合、リモートファイルがゴミ箱に移動されることはありません。代わりに削除されます。

コマンド: set-file-modes filename mode &optional flag

この関数は、filename のファイルモード(またはパーミッション)をmodeに設定します。

デフォルトでは、この関数はシンボリックリンクを辿ります。ただし、オプション引数 flag がシンボル nofollow である場合、filename がシンボリックリンクであってもこの関数はそれを辿りません。これにより、意図せず別の場所にあるファイルのモードビットを変更してしまうのを防ぐことができます。シンボリックリンクのモードビット変更をサポートしていないプラットフォームでは、filename がシンボリックリンクで flag が nofollow である場合に、この関数はエラーを通知します。

非対話的に呼び出された場合、modeは整数である必要があります。整数の下位12ビットのみが使用され、ほとんどのシステムでは下位9ビットのみが有効です。8進数用のLisp構文を使用してmodeを入力できます。例えば、

(set-file-modes "myfile" #o644 'nofollow)

ファイルが所有者にとって読み取りおよび書き込み可能で、グループメンバーにとって読み取り可能、かつその他のすべてのユーザーにとって読み取り可能であることを指定します。モードビットの指定に関する説明については、The GNU Coreutils ManualのFile permissionsを参照してください。

インタラクティブには、mode は read-file-modes(後述)を用いてミニバッファから読み込まれ、これによりユーザーは権限を記号的に表す整数または文字列のいずれかを入力できます。

ファイルの権限を返す関数 file-modes については、アクセシビリティのテスト を参照してください。

関数: set-default-file-modes mode

この関数は、Emacsおよびそのサブプロセスによって作成される新規ファイルのデフォルト権限を設定します。Emacsで作成されるすべてのファイルは、初期状態でこれらの権限、またはその一部を保持します(write-region は、デフォルトのファイル権限で実行が許可されていても、実行権限を付与しません)。GNUおよびその他のPOSIX準拠システムでは、デフォルト権限は ‘umask’ のビット単位の補数によって決定されます。つまり、引数 mode でセットされている各ビットは、Emacsがファイルを作成する際のデフォルト権限において リセット されます。

引数 mode は、上記の set-file-modes と同様に、権限を指定する整数である必要があります。下位 9 ビットのみが有効です。

既存ファイルの変更版を保存する場合、デフォルトのファイル権限は適用されません。ファイルを保存すると、既存の権限が維持されます。

マクロ: with-file-modes mode body…

このマクロは、新規ファイルのデフォルト権限を一時的に modes(その値は前述の set-file-modes と同様)に設定した状態で、body 形式を評価します。処理完了後、元のデフォルトファイル権限を復元し、body 内の最後の形式の値を返します。

これは例えば、プライベートなファイルを作成する際に便利です。

関数: default-file-modes

この関数は、デフォルトのファイル権限を整数として返します。

関数: read-file-modes &optional prompt base-file

この関数は、ミニバッファから一連のファイルモードビットを読み込みます。第1のオプション引数 prompt は、デフォルト以外のプロンプトを指定します。第2のオプション引数 base-file は、ユーザーが入力した内容が既存ファイルの権限に対する相対的なモードビットを指定する場合に、この関数が返すモードビットの根拠となるファイルの名前です。

ユーザー入力が8進数である場合、この関数はその数値を返します。"u=rwx"のようにモードビットの完全な記号指定である場合、関数はfile-modes-symbolic-to-numberを用いてそれを同等の数値に変換し、その結果を返します。"o+g"のように相対指定である場合、その指定の根拠となる権限はbase-fileのモードビットから取得されます。base-fileが省略されているか、またはnilである場合、関数は0をベースとなるモードビットとして使用します。完全な指定と相対指定は、"u+r,g+rx,o+r,g-w"のように組み合わせて使用できます。ファイルモード指定の説明については、The GNU Coreutils ManualのFile permissionsを参照してください。

関数: file-modes-symbolic-to-number modes &optional base-modes

この関数は、modes で指定されたシンボリックなファイルモードを、対応する整数値に変換します。シンボリックな指定が既存のファイルに基づいている場合、そのファイルのモードビットはオプション引数 base-modes から取得されます。この引数が省略された場合、または nil が指定された場合は、デフォルトで 0、すなわちアクセス権が全くない状態となります。

関数: file-modes-number-to-symbolic modes

この関数は、modes で指定された数値形式のファイルモードを、対応する文字列形式に変換します。この関数が返す文字列は、シェルコマンド ls -l および file-attributes が出力する形式と同じであり、file-modes-symbolic-to-number やシェルコマンド chmod が受け付けるシンボリック形式ではありません。

関数: set-file-times filename &optional time flag

この関数は、filename のアクセス時刻および変更時刻を time に設定します。戻り値は、時刻の設定に成功した場合は t、それ以外の場合は nil となります。time のデフォルト値は現在時刻であり、時刻値である必要があります(Time of Day を参照)。

デフォルトでは、この関数はシンボリックリンクを辿ります。ただし、オプション引数 flag がシンボル nofollow である場合、filename がシンボリックリンクであってもこの関数はそれを辿りません。これにより、意図せず別の場所にあるファイルのタイムスタンプを変更してしまうのを防ぐことができます。シンボリックリンクのタイムスタンプ変更をサポートしていないプラットフォームでは、filename がシンボリックリンクで flag が nofollow である場合に、この関数はエラーを通知します。

関数: set-file-extended-attributes filename attribute-alist

この関数は、filename に Emacs が認識する拡張ファイル属性を設定します。第2引数 attribute-alist には、file-extended-attributes が返すものと同じ形式のアリストを指定する必要があります。属性の設定に成功した場合は t が、そうでない場合は nil が返り値となります。拡張ファイル属性 を参照してください。

関数: set-file-selinux-context filename context

この関数は、filename の SELinux セキュリティコンテキストを context に設定します。引数 context にはリスト (user role type range) を指定する必要があり、各要素は文字列である必要があります。拡張ファイル属性 を参照してください。

この関数は、filename の SELinux コンテキストの設定に成功した場合は t を返します。コンテキストが設定されなかった場合(例:SELinux が無効な場合や、Emacs が SELinux サポートなしでコンパイルされた場合)は nil を返します。

関数: set-file-acl filename acl

この関数は、filename のアクセス制御リストを acl に設定します。引数 acl は、関数 file-acl が返すものと同じ形式である必要があります。拡張ファイル属性 を参照してください。

この関数は、filename の ACL 設定に成功した場合は t を、そうでない場合は nil を返します。