Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all bug

名前

       rename - ファイルの名前や位置を変更する

書式

       #include <stdio.h>

       int rename(const char *oldpath, const char *newpath);

説明

       rename()      はファイルの名前を変更し、必要ならばディレクトリ間の移動を行なう。     そのファイルに対する
       (link(2) を使用して作られた) 他のハードリンク (hard link) には影響はない。 オープン済の oldpath  に対する
       ファイルディスクリプタにも影響はない。

       newpath が既に存在する場合、それは不可分操作で (atomically) 置き換えられる (ただし、いくつかの条件がある;
       以下の「エラー」のセクションを参照)。 そのため、 newpath にアクセスしようとしている他のプロセスがファイル
       を見失うことはない (訳註: 常にアクセス可能である)。

       oldpathnewpath がどちらも既存のハードリンクで、同じファイルを参照している場合、 rename() は何も行わ
       ず、ステータスとして成功を返す。

       newpath が存在し、何らかの理由で操作が失敗した場合、 rename()  は newpath  の実体を元のまま残すことを保証
       する。

       oldpath  にはディレクトリを指定することもできる。 この場合、 newpath は存在しないか、空のディレクトリでな
       ければならない。

       一方で、上書きを行なう場合は、rename が行なわれるファイルを oldpathnewpath の両方で参照できる瞬間がお
       そらく存在する。

       oldpath がシンボリックリンク (symbolic  link)  を参照している場合は、  リンクの名前が変更される。  また、
       newpath がシンボリックリンクを参照している場合は、リンクが上書きされる。

返り値

       成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

       EACCES oldpath  または  newpath  を含んでいるディレクトリの書き込み許可がない。  または、  oldpath または
              newpath のディレクトリ部分のどれかに検索許可がない。 または、 oldpath がディレクトリで (..  エント
              リを更新するのに必要な) 書き込み許可がない (path_resolution(7)  も参照)。

       EBUSY  oldpath または newpath がディレクトリで、何らかのプロセスが使用中  (多分、カレントワーキングディレ
              クトリか、ルートディレクトリか、 読み込みのためにオープンされているかでろう)  もしくは、システムが
              使用中 (例えばマウントポイントである)  であり、システムがこれをエラーであると判断したために rename
              が失敗した。 (このような場合に EBUSY を返すことは規格では要求されていない点に注意すること。 このよ
              うな場合に、rename をとにかく実行してみるのは何の問題もない。 ただし、そのような状況で、システムが
              他に返すエラーがない場合には EBUSY を返すことが許されている。)

       EDQUOT ディスクブロックか inode がそのファイルシステムのユーザクォータに達していた。

       EFAULT oldpathnewpath がアクセス可能なアドレス空間の外を指している。

       EINVAL newpatholdpath のパス部分を含んでいる。ディレクトリを自分自身のサブディレクトリに 変更しようと
              した場合がほとんどである。

       EISDIR newpath は存在しているディレクトリであるが、 oldpath はディレクトリでない。

       ELOOP  oldpath または newpath を解決する際に遭遇したシンボリックリンクが多過ぎる。

       EMLINK oldpath  は既に最大数までのリンクを持っているか、それがディレクトリで newpath を含んでいるディレク
              トリが最大数までのリンクを持っている。

       ENAMETOOLONG
              oldpath または newpath が長過ぎる。

       ENOENT oldpath という名前のリンクが存在しない。 または、  newpath  というディレクトリが存在しない。  また
              は、 oldpathnewpath が空の文字列である。

       ENOMEM 十分なカーネルメモリーがない。

       ENOSPC そのファイルを含んでいるデバイスに新しいディレクトリエントリを 作成するための空きがない。

       ENOTDIR
              oldpathnewpath に含まれているディレクトリ部分が 実際にはディレクトリでない。 または oldpath が
              ディレクトリで、 newpath が存在してディレクトリでない。

       ENOTEMPTY  または  EEXIST
              newpath が空でないディレクトリである。すなわち "." と ".." 以外を含んでいる。

       EPERM または EACCES
              oldpath  のあるディレクトリにスティッキービット (sticky bit)  (S_ISVTX)  が設定されており、 プロセ
              スの実効ユーザー ID が 削除しようとするファイルのユーザー ID  と  そのファイルを含むディレクトリの
              ユーザー  ID のいずれとも一致せず、かつ プロセスに特権がない (Linux では CAP_FOWNER ケーパビリティ
              (capability) がない)。 または、  newpath  がすでに存在するファイルで、親ディレクトリにスティッキー
              ビットが設定されており、  プロセスの実効ユーザー  ID が 置き換えようとするファイルのユーザー ID と
              そのファイルを含むディレクトリのユーザー ID のいずれとも一致せず、かつ プロセスに特権がない (Linux
              では CAP_FOWNER ケーパビリティがない)。 または oldpathnewpath が存在するファイルシステムが、要
              求された種類の名前の変更を サポートしていない。

       EROFS  ファイルが読み込み専用のファイルシステムに存在する。

       EXDEV  oldpathnewpath が同じマウントされたファイルシステムに存在しない。 (Linux は 1 つのファイルシス
              テムを複数のマウント位置に マウントすることを許可している。 しかし rename() は、たとえ同じファイル
              システムであっても、 別々のマウント位置を跨いでは動作しない。)

準拠

       4.3BSD, C89, C99, POSIX.1-2001.

バグ

       NFS ファイルシステムでは、操作が失敗したからといって、 ファイルの名前が変更できなかったと決めてかかること
       はできない。 サーバが rename 操作を終えてからクラッシュした場合、 サーバが再び立ち上がったときに、 再送信
       された RPC が処理されるが、これは失敗となる。  アプリケーションはこの問題を正しく取り扱うことが期待されて
       いる。 同様の問題について link(2)  にも書かれている。

関連項目

       mv(1), chmod(2), link(2), renameat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.54 の一部 である。プロジェクトの説明とバグ報告
       に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。

Linux                                              2013-01-27                                          RENAME(2)