質問: シェルでファイルを別のディレクトリに移動したいです。 mvをして何らかの原因で失敗した場合、データ損失の可能性がありますか? 一般的な業務レベルの方法として、ファイル移動をして、ファイル移動が成功したことの確認方法も教えていただけますと幸甚です。
回答: データ損失を定義しないと話がかみ合わないでしょう。例えば ``` $ mv filea backup/filea ``` であっても、既にある `backup/filea` は削除され失われます。これはデータ損失でしょうか、そうではないのでしょうか? 意図したファイルの削除は除き、ファイル内容が変化するか否かだけ考えるとして 1.同一ファイルへの `mv` は事前に検出され何も起きません。つまり損失なしです。ンなアホなことしないと思いこみがちですが symlink があると気付かずに同一ファイルへの `mv` になってしまうことはまれによくあります。 ``` $ mv fileb . $ mv filec /filec 同一ファイルの指摘がなされてエラー ``` 2.ディレクトリ構造を矛盾させる `mv` は事前に検出され以下略。 ``` $ mkdir hoge $ mkdir hoge/piyo $ mv hoge hoge/piyo ディレクトリのサブディレクトリへの移動はエラー ``` 3.同一ディスク装置内で使われる場合 `inode` とファイル名の対応(のことをディレクトリエントリと呼びます)が変わるだけでファイル本体にはノータッチなので、データ損失はないと考えていいです。 ``` $ mv filed filee 同一ディレクトリ内移動は同一装置内と思われるので損失なしに成功 ``` 4.同一マシン内の別ディスク装置に移動させる場合はファイル本体のコピーが入ります。容量不足等があったらコピー中に失敗し元ファイルは消さないので損失なし。 ``` $ mv filef /mounted_other_drive/fileg ``` 5.異マシン・異構造のファイルシステムへの移動は同上。ただしマウント先に機能が無い情報は失われます。例えばスパースファイルをスパース機能のないマウント先に `mv` するとサイズが爆発するでしょう(未テスト)。 コピー中に、ディスク装置の故障でデータ化けするとかは考慮してません ( `mv` 固有の話ではないため) `GNU coreutils` 中の `mv` や `cp` のデータコピー部ソース `copy.c` をちょろっと見た範囲では、コピー元と先でファイル内容の CRC 値を比較するなどの挙動はしていないです(ハードウエアレベルで化けない前提でコード書かれています)。ネットワーク上のデータ化けは TCP レベルで訂正されるので問題ないです。