yokota@yynet.tama.tokyo.jp writes:

> ここで、A と B を tmp/ に移動しようとすると、
> 
>  % mv -f A B tmp 
>  mv: cannot create hard link `tmp/B' to `tmp/A': File exists
> 
> 怒られちゃうんですけど、そういうモンなんでしょうか?
> fileutils の以前のバージョンは怒らずにできていたと思うんだけど ...。

「すでに目的のディレクトリにmoveしたファイルと(inodeが)同じファイルを
moveするときは,単にhard linkを作る」という最適化(?)をしてますね.

  rename("A", "tmp/A");
  rename("B", "tmp/B");
でなくて,
  rename("A", "tmp/A");
  link("tmp/A", "tmp/B");
  unlink("B");
の順でやろうとして,linkで失敗しています.

レポートしてあげると良いんじゃないかな.

4.0だと,ちょっと違う結果になりますが,やっぱり怒られます.

$ mv --version
mv (GNU fileutils) 4.0
$ touch A tmp/A tmp/B
$ ln A B
$ ls -li {tmp/,}[AB]
 373251 -rw-r--r--   2 mad      users           0 Aug 14 11:01 A
 373251 -rw-r--r--   2 mad      users           0 Aug 14 11:01 B
 459047 -rw-r--r--   1 mad      users           0 Aug 14 11:01 tmp/A
 459211 -rw-r--r--   1 mad      users           0 Aug 14 11:01 tmp/B
$ mv -f A B tmp
mv: tmp/B: No such file or directory
$ ls -li {tmp/,}[AB]
 373251 -rw-r--r--   2 mad      users           0 Aug 14 11:01 B
 373251 -rw-r--r--   2 mad      users           0 Aug 14 11:01 tmp/A

straceしてみると,
  unlink("tmp/A");
  rename("A", "tmp/A");
  unlink("tmp/B");
  link("tmp/B", "tmp/B");
とかやってます.何なんだ.

                                前田敦司