fileutils-4.1 の mv を使っています。(Debian GNU/Linux woody)
% mv --version
mv (fileutils) 4.1
Written by Mike Parker, David MacKenzie, and Jim Meyering.
<snip>
ハードリンクのファイルの扱いなんですけど、
% mkdir tmp
% touch A tmp/A tmp/B
% ln A B
% ls -lRi
.:
total 4
2232056 -rw-r--r-- 2 yokota yokota 0 Aug 14 09:37 A
2232056 -rw-r--r-- 2 yokota yokota 0 Aug 14 09:37 B
2232055 drwxr-xr-x 2 yokota yokota 4096 Aug 14 09:37 tmp
./tmp:
total 0
2232057 -rw-r--r-- 1 yokota yokota 0 Aug 14 09:37 A
2232058 -rw-r--r-- 1 yokota yokota 0 Aug 14 09:37 B
ここで、A と B を tmp/ に移動しようとすると、
% mv -f A B tmp
mv: cannot create hard link `tmp/B' to `tmp/A': File exists
怒られちゃうんですけど、そういうモンなんでしょうか?
fileutils の以前のバージョンは怒らずにできていたと思うんだけど ...。
> 怒られちゃうんですけど、そういうモンなんでしょうか?
* `mv DIR EXISTING-FILE' no longer removes EXISTING-FILE. Now it gets an error
as POSIX says it must.
なんてのを、http://www.geocrawler.com/archives/3/323/2001/4/0/5665735/
で見つけました。きっとアーカイブの CHANGES とかにも入っているのでは?
まぁ、私の知ってる範囲だと、上書きする方が普通なんで気持ち悪いですが。
--
池田研二 稲城駅前在住
> * `mv DIR EXISTING-FILE' no longer removes EXISTING-FILE. Now it gets an error
> as POSIX says it must.
> なんてのを、http://www.geocrawler.com/archives/3/323/2001/4/0/5665735/
> で見つけました。きっとアーカイブの CHANGES とかにも入っているのでは?
失礼、source は DIR じゃなかったですね。ううむ。
--
池田研二 稲城駅前在住
> ここで、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");
とかやってます.何なんだ.
前田敦司
<m3smo4h...@maedapc.cc.tsukuba.ac.jp>の記事において
ma...@cc.tsukuba.ac.jpさんは書きました。
>> > % mv -f A B tmp
>> > mv: cannot create hard link `tmp/B' to `tmp/A': File exists
>> >
>> > 怒られちゃうんですけど、そういうモンなんでしょうか?
>> > fileutils の以前のバージョンは怒らずにできていたと思うんだけど ...。
>>
>> 「すでに目的のディレクトリにmoveしたファイルと(inodeが)同じファイルを
>> moveするときは,単にhard linkを作る」という最適化(?)をしてますね.
<snip>
>> レポートしてあげると良いんじゃないかな.
今日 bug-fileutils@ にレポート出してみました。けど、
出したあとに www.gnu.org を見て知ったんですけど、fileutils は
coreutils に含まれるようになったんですね。
で coreutils-5.0 の mv を使ってみたところ、問題なくできました。
strace で見ると、
rename("A", "tmp/A") = 0
link("tmp/A", "tmp/B") = -1 EEXIST (File exists)
unlink("tmp/B") = 0
link("tmp/A", "tmp/B") = 0
unlink("B") = 0
だそうで。
## あぁ、レポート送る前にもっと調べればよかった ...