mv と rsync 類似のプログラムではありません。特に、mv 多くの場合、単にオブジェクトの名前を変更しようとしています。同じファイルシステムにある場合、内容はまったくコピーされません。
imperative_PLs/fortran をまだ持っていない場合 、次に mv 既存の fortran を使用します ディレクトリに移動し、ツリー内のそのポイントに名前を変更します。
ただし、その場所には既に (コンテンツを含む) ディレクトリがあります。名前は 1 つのオブジェクトしか参照できないため、既存のディレクトリを削除するか名前を変更する必要があります。 mv どちらもしたくないと仮定して中止します。
rsync 代わりに、個々のファイルとその他のコンテンツを fortran 内にコピーします それらを既存の imperative_PLs/fortran に入れます ディレクトリ。
rename と考えてください。 代わりに、動作がより理解しやすいように見える場合があります。
mv 実際は rename です
ファイルを別のファイルに移動する場合、mv あなたが何をしているのかを知っていると仮定して、目的のファイルを上書きします.
ディレクトリを別のディレクトリに移動する場合、mv 元のディレクトリのベース名を保持し、ターゲット ディレクトリに作成することを前提としています。宛先側にその名前のディレクトリがまだない場合、またはその名前のディレクトリが存在するが空の場合、操作は成功します。
ただし、ターゲット ディレクトリが既に存在し、空でない場合、これは rename ではなくなります。 しかし、それは再帰的なファイルとディレクトリの削除でなければなりません。 rename それを行うように設計されていないため、失敗します mv あなたがそれをしたくないと仮定して失敗するので、それ以上は進みません。
<オール>
mv そのように設計されていないため、この場合は機能しません。システムコールは (おそらく) どちらかです
- 同じファイルシステムに移動:
rename(元のlinkとunlink) - ファイルシステム間を移動:再帰的なファイル コピーの後に再帰的な
unlinkが続く
意見:ない このユースケースを処理するように設計されていないためです。 1 つのことをうまく行うことを目的とした「単純な」ツールの場合、mv に示すスイッチのセットを提供する必要があります。 これらのアクション パスのどれをとるか:
- 現在の実装のように、エラーで保釈する
- マージするには、ファイルが既に存在する場合はエラーで救済します
- マージするには、既存のターゲット ファイルを置き換えます
マージ/置換アクションが必要な場合は、 cp で簡単に実装できます 続いて rm 、またはファイル ツリー コピー ユーティリティ tar のいずれかを使用して 、 pax など