Next: , Previous: , Up: ファイル   [Contents][Index]


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

このセクションの関数はファイルのリネーム、コピー、削除やリンク、モードをセットします。これらの関数は処理に失敗すると、通常は失敗の理由を記述するシステム依存のエラーメッセージを報告するfile-errorエラーをシグナルします。ファイルが存在しないために失敗すると、かわりにfile-missingエラーをシグナルします。

性能的な理由によりオペレーティングシステムはこれらの関数により行われた変更を2次記憶装置に書き込むかわりに、キャッシュしたりエイリアスするかもしれません。ファイルと二次媒体を参照してください。

引数newnameをもつ関数では、それがディレクトリー名ならsource名の非ディレクトリー部分が追加されたかのように扱われます。ディレクトリー名は通常は‘/’で終端されます(ディレクトリーの名前を参照)。たとえばoldnamea/b/cnewnamed/e/f/ならd/e/f/cであるかのように処理されます。newnameがディレクトリー名ではなくディレクトリーであるような名前なら、この特別な扱いは適用されません。たとえばnewnamed/e/fがディレクトリーでも、そのまま処理されます。

newnameという引数をもつ関数では、newnameという名前のファイルが既に存在する場合には、その挙動が引数ok-if-already-existsの値に依存します。

Command: add-name-to-file oldname newname &optional ok-if-already-exists

この関数は、oldnameという名前のファイルにnewnameという名前を追加で与える。これはnewnameという名前がoldnameにたいする新たなハードリンクになることを意味する。

newnameがシンボリックリンクなら、リンクが指すディレクトリーエントリーではなく、シンボリックリンクリンクのディレクトリーエントリーが置き換えられる。oldnameがシンボリックリンクなら、この関数はリンクをフォローする可能性があるが、GNUプラットフォームではリンクをフォローしない。oldnameがディレクトリーなら、たとえ処理を正常に行ってツリー構造ではないファイルシステムを作成できる古い様式の非GNUプラットフォームのスーパーユーザーでも、この関数は通常は失敗する。

以下の例の最初の部分では2つのファイルfoofoo3をリストする。

$ 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つのファイルにたいして2つの名前foofoo2が表示される。

(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つのファイルにたいして3つの名前foofoo2foo3がある。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も参照のこと。

Command: rename-file filename newname &optional ok-if-already-exists

このコマンドはfilenamenewnameにリネームする。

filenamefilenameとは別に追加の名前をもつ場合には、それらは自身の名前をもち続ける。実際のところadd-name-to-fileで名前newnameを追加してからfilenameを削除するのは、瞬間的な遷移状態とエラーの処理、ディレクトリーとシンボリックリンクを別とすればリネームと同じ効果がある。

このコマンドはシンボリックリンクをフォローしない。filenameがシンボリックリンクなら、このコマンドはリンクが指すファイルではなくシンボリックリンクをリネームする。newnameがシンボリックリンクなら、リンクが指すディレクトリーエントリーではなくリンクのディレクトリーエントリーを置き換える。

filenamenewnameが同じディレクトリーエントリー(親ディレクトリーが同じでありそのディレクトリー内で同じ名前を与える)なら、このコマンドは何もしない。それ以外ならfilenamenewnameが同一のファイルを命名する場合には、このコマンドはPOSIX準拠システムでは何も行わなず、いくつかの非POSIXシステムではfilenameを削除する。

newnameがすでに存在する場合にはoldnameがディレクトリーなら空のディレクトリー、非ディレクトリーなら非ディレクトリーでなければならない。

Command: copy-file oldname newname &optional ok-if-already-exists time preserve-uid-gid preserve-permissions

このコマンドはファイルoldnamenewnameにコピーする。oldnameが通常のファイルでなければエラーをシグナルする。newnameがディレクトリーなら最後の名前コンポーネントを保持するようにディレクトリーの中にoldnameをコピーする。

この関数はnewnameを作成するために壊れたシンボリックリンクをフォローしない点を除いて、シンボリックリンクをフォローする。

timeが非nilなら、この関数は新たなファイルにたいして古いファイルと同じ最終変更時刻を与える(これはいくつかの限られたオペレーティングシステムでのみ機能する)。時刻のセットでエラーが発生すると、copy-filefile-date-errorエラーをシグナルする。インタラクティブに呼び出された場合には、プレフィックス引数はtimeにたいして非nil値を指定する。

引数preserve-uid-gidnilなら、新たなファイルのユーザーとグループの所有権の決定をオペレーティングシステムに委ねる(通常はEmacsを実行中のユーザー)。preserve-uid-gidが非nilなら、そのファイルのユーザーとグループの所有権のコピーを試みる。これはいくつかのオペレーティングシステムで、かつそれを行うための正しいパーミッションをもつ場合のみ機能する。

オプション引数preserve-permissionsが非nilなら、この関数はoldnameのファイルモード(または“パーミッション”)、同様にACL(Access Control List)とSELinuxコンテキストをnewnameにコピーする。ファイルの情報を参照のこと。

それ以外では、newnameが既存ファイルならファイルモードは変更されず、新たに作成された場合はデフォルトのファイルパーミッション(以下のset-default-file-modesを参照)によりマスクされる。どちらの場合でもACLやSELinuxコンテキストはコピーされない。

このコマンドはlinknameという名前でtargetにたいするシンボリックリンクを作成する。これはシェルコマンドと‘ln -s target linkname’と似ている。targetは文字列としてのみ扱われる。既存ファイルの名前である必要はない。ok-if-already-existsが整数ならインタラクティブな使用を意味しており、target文字列内の先頭の‘~’は展開されて、先頭の‘/:’は取り除かれる。

targetが相対ファイル名なら結果となるシンボリックリンクはシンボリックリンクを含むディレクトリーにたいして相対的に解釈される。絶対ファイル名と相対ファイル名を参照のこと。

targetlinknameの両方がリモートファイル構文をもち、かつ両者のリモート識別が等価なら、シンボリックリンクはtargetのローカルファイル名部分を指す。

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

Command: delete-file filename &optional trash

このコマンドはファイルfilenameを削除する。ファイルが複数の名前をもつ場合には他の名前で存在し続ける。filenameがシンボリックリンクならdelete-fileはシンボリックリンクだけを削除してターゲットは削除しない。

このコマンドはfilenameが削除できなければ、適切な種類のfile-errorエラーをシグナルする(GNU/およびその他のPOSIX準拠システムではファイルのディレクトリーが書き込み可能ならファイルは削除可能)。ファイルが存在しない場合には、このコマンドは何のエラーもシグナルしない。

オプション引数trashが非nil、かつ変数delete-by-moving-to-trashが非nilなら、このコマンドはファイルを削除するかわりにシステムのTrash(ゴミ箱)にファイルを移動する。Miscellaneous File Operations in The GNU Emacs Manualを参照のこと。インタラクティブに呼び出された際には、プレフィックス引数がなければtrasht、それ以外はnil

ディレクトリーの作成・コピー・削除delete-directoryも参照のこと。

Command: set-file-modes filename mode &optional flag

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

この関数はデフォルトではシンボリックリンクをフォローする。しかしオプション引数flagがシンボルnofollowの場合には、filenameがシンボリックリンクでもこの関数はシンボリックリンクをフォローしない。これによりどこか別の場所で意図せずモードビットを変更してしまうことを防げるかもしれない。シンボリックリンクでのモードビット変更をサポートしないプラットフォームでは、この関数はfilenameがシンボリックリンクかつflagnofollowの際にエラーをシグナルする。

非インタラクティブに呼び出された場合には、modeは整数でなければならない。その整数の下位12ビットだけが使用される。ほとんどのシステムでは意味があるのは下位9ビットのみ。modeを入力するLisp構文を使用できる。たとえば、

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

これはそのファイルにたいして所有者による読み取りと書き込み、グループメンバーによる読み取り、その他のユーザーによる読み取り可能であることを指定する。モードビットの仕様の説明はFile permissions in The GNU Coreutils Manualを参照のこと。

インタラクティブに呼び出されると、moderead-file-modes(以下参照)を使用してミニバッファーから読み取られる。この場合にはユーザーは整数、またはパーミッションをシンボルで表現する文字列をタイプできる。

ファイルのパーミッションをリターンする関数file-modesについてはアクセシビリティのテストを参照のこと。

Function: set-default-file-modes mode

この関数はEmacsおよびEmacsのサブプロセスが新たに作成するファイルにデフォルトのパーミッションをセットする。Emacsにより作成されたすべてのファイルはこれらのパーミッション、およびそれらのサブセットとなるパーミッションをもつ(デフォルトファイルパーミッションが実行を許可しても、write-regionは実行パーミッションを付与しないだろう)。GNUやその他のPOSIX準拠システムでは、デフォルトのパーミッションは‘umask’の値のビット単位の補数で与えられる。すなわち引数modeでセットされた各ビットはEmacsが作成するファイルのデフォルトパーミッション内ではリセットされる。

引数modeは上記のset-file-modesと同様、パーミッションを指定する整数であること。意味があるのは下位9ビットのみ。

デフォルトのファイルパーミッションは、既存ファイルの変更されたバージョンを保存する際は効果がない。ファイルの保存では既存のパーミッションが保持される。

Macro: with-file-modes mode body…

このマクロは新たなファイルにたいするデフォルトのパーミッションを一時的にmodes (値は)set-file-modesにたいする値と同様)にセットしてフォームbodyを評価する。終了時には元にデフォルトのファイルノパーミッションをリストアして、bodyの最後のフォームの値をリターンする。

これはたとえばプライベートファイルの作成に有用である。

Function: default-file-modes

この関数はデフォルトのファイルのパーミッションを整数でリターンする。

Function: 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"のように組み合わせることができる。ファイルモード指定の説明はFile permissions in The GNU Coreutils Manualを参照のこと。

Function: file-modes-symbolic-to-number modes &optional base-modes

この関数はmodes内のシンボルによるファイルモード指定を等価な整数に変換する。シンボル指定が既存ファイルにもとづく場合には、オプション引数base-modesからそのファイルのモードビットが取得される。その引数が省略またはnilなら、0(すべてのアクセスが許可されない)がデフォルトになる。

Function: file-modes-number-to-symbolic modes

この関数はmodes内の数値ファイルモード指定を等価な文字列形式に変換する。 This function converts a numeric file mode specification in modes into the equivalent string form. この関数がリターンする文字列はシェルコマンドのls -lfile-attributesが生成する文字列と同じであり、file-modes-symbolic-to-numberやシェルコマンドのchmodが受け付けるシンボリックフォーマットとは異なる

Function: set-file-times filename &optional time flag

この関数はfilenameのアクセス時刻と変更時刻をtimeにセットする。時刻が正しくセットされればt、それ以外はnilがリターン値となる。timeのデフォルトはカレント時刻でありtime値でなければならない(時刻を参照)。

この関数はデフォルトではシンボリックリンクをフォローする。しかしオプション引数flagがシンボルnofollowの場合には、filenameがシンボリックリンクでもフォローしない。これはどこか別の場所でファイル時刻をうっかり変更してしまうことを防ぐのに役立つかもしれない。シンボリックリンクの時刻変更をサポートしないプラットフォームでは、この関数はfilenameがシンボリックリンクかつflagnofollowの際にはエラーをシグナルする。

Function: set-file-extended-attributes filename attribute-alist

この関数はfilenameにたいしてEmacsが認識する拡張ファイル属性をセットする。2つ目の引数attribute-alistfile-extended-attributesがリターンするalistと同じ形式であること。属性のセットが成功したらt、それ以外はnilがリターン値となる。拡張されたファイル属性を参照のこと。

Function: set-file-selinux-context filename context

この関数はfilenameにたいするSELinuxセキュリティコンテキストにcontextをセットする。context引数は各要素が文字列であるような(user role type range)というリストであること。拡張されたファイル属性を参照のこと。

この関数はfilenameのSELinuxコンテキストのセットに成功したらtをリターンする。コンテキストがセットされなかった場合(SELinuxが無効、またはEmacsがSELinuxサポートなしでコンパイルされた場合等)にはnilをリターンする。

Function: set-file-acl filename acl

この関数はfilenameにたいするACLにaclをセットする。acl引数は関数file-aclがリターンするのと同じ形式であること。拡張されたファイル属性を参照のこと。

この関数はfilenameのACLのセットに成功したらt、それ以外はnilをリターンする。


Next: ファイルと二次媒体, Previous: ファイルの情報, Up: ファイル   [Contents][Index]