Re: hard link & mv (fileutils-4.1)
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");
とかやってます.何なんだ.
前田敦司
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735