これ日本語で調べると全く出てこないので、日本語の記事1号を狙っていきます笑。というかこのエラーはターミナルについ文句をいいたくなるようなエラーです。「同じファイルです」、いや違うじゃんってね。"mv"って基本で簡単であるが故にエラー出てくるとやっかいですよね。では本題へ。
基本から確認
私の公開するプログラムって割とsystemコマンドからコンソールでの操作を行うのですが、そんなときに突き当たったエラーについてです。まず初めにこのページにたどり着くということはおそらくmvを使ってファイルの移動を行おうとしているかと思いますので、まずそこに間違いがないか確認しましょう。オプションなどは省きますが、mvコマンドの文法は以下ですね。
$ mv [移動ないしはリネームしたいファイル] [移動ないしリネーム後のファイルパスか名前]
まずこの認識は間違いありませんか?第一引数と第二引数が同じだと 「同じファイルです」なり"are the same file" と帰ってきます。これであれば移動後のファイルの名前を変えれば大丈夫です。
例.
$ mv test test → $ mv test test2
一応補足しておくと例えばディレクトリの名前とファイルの名前が同じで、そのファイルを一つ上の階層に移動させたいとき以下のようなコマンドを入力しなければなりませんが、これで ~は同じファイルです (are the same file)と言われてもどうしようもありません。
例.
$ mv huga/huga huga
これを実行するには違う名前にリネームしてから名前を戻すっていう二度手間をするしかありません。
例.
$ mv huga/huga hoge && mv hoge huga
これでとりあえず基本は大丈夫かとは思います。ただエラーを見ればLinuxを触っている人なら気づきそうなので、これにあたっても調べるまでもなく解決できることがほとんどかと思うので、本題です。
別名で指定しているのに ~ は同じファイルです ( ~ are the same file)と出る。
まずこんなコマンドを実行することを考えます。
$ mv hoge/text.txt huga/hoge.txt
最初の基本から見ると問題なさそうなコマンドなのですが、なぜか ~ は同じファイルです (are the same file)と返されます。文法的に問題ないのになぜこうなってしまうのでしょうか。
ちなみにあなたは、mvコマンドをどこからどこにに使おうとしていますか?
例えばあるファイルをフォルダAからフォルダBに移動させてからもう一度フォルダAに戻すような操作をした場合でこの~は同じファイルですと言われたりします。これをcifsなどキャッシュとしてデータを保存する場所で行うとこのようなエラーが出る場合があります。cifsって簡単に言うとNASです。
キャッシュとは一言でいえば昔どんなファイルがあったかを覚えている記憶みたいなもので、こんなファイルがあったっていうのが残ってしまっているが故に起こるエラーです。対処方法はcifsのマウントについて書いてある"/etc/fstab"を変更します。
もしも恒久的なマウントではなく、一時的なマウントでmountコマンドを利用されている場合は、同様にmount以降につけるオプションにて以下に示す変更を適用してください。
例えばこの設定だと、
//IP/hoge /huga cifs guest,sec=ntlmssp,iocharset=utf8,rw,uid=1000,gid=1000,noauto,x-systemd.automount 0 0
オプションのところに「cache=none」を追記してこんな感じにすれば大丈夫です。
//IP/hoge /huga cifs cache=none,guest,sec=ntlmssp,iocharset=utf8,rw,uid=1000,gid=1000,noauto,x-systemd.automount 0 0
おそらくこれで大丈夫かと思います。調べるとcifs特有の症状みたいですね。USBメモリ等の外部デバイスで発生は確認していませんが、発生してしまった場合はキャッシュを確認したほうが良いかと思います。
これ以外の状況で発生したら今の状態ではお手上げです。来てくれた方はごめんなさい。これ以上のエラーはないと信じたい…
まとめ
私は、C言語から面倒なのでsystemコマンドでファイルを利用しようとした際にこのエラーが出ました。そしてコマンドライン上で実行しても同様のエラーが出てから、C言語から操作することに起因するエラーではないことまではわかったのですが、ここからが長かったです。色々なサイトを探し回って、どうやらNAS上でなければ再現しないらしいところを突き止めるまでは大変でした。突き止めた後はcifsマウントの設定を探し出しなんとか解決に至ることができました。上ではさも簡単なように解決方法として書いていますが、原因を突き止めるのも、解決方法を探すのも非常に大変でした。どうかこの経験がだれかのお役に立てますように。
移動元と移動先がhardlinkされているとlocalのfilesystemでも発生する。
.
├ a
│└ a.txt
└ b
└ b.txt
a/a.txtとb/b.txtがhardlinkされていると、
#mv a/a.txt b/b.txt
mv: 'a/a.txt' and 'b/b.txt' are the same file
#mv -f a/a.txt b/b.txt
mv: 'a/a.txt' and 'b/b.txt' are the same file
-f を指定してもエラー。
コメントありがとうございます。
そういう場合でもそうなりますね。(個人的には)あまり使わない方法なので見落としていました。
ハードリンク(Hardlink)は基本的にinodeと呼ばれるファイルの情報を示す管理ファイルを紐づけるものですね。
Linuxの管理ではファイルそのものの実態ではなく、inodeによってファイルの場所を示しているため、ハードリンクされたファイルはOS側の認識としては同じものを指していることになります。