GNU/Linux >> Linux の 問題 >  >> Linux

なぜ mv は宛先に同名のディレクトリが存在することを処理できないのですか?

mvrsync 類似のプログラムではありません。特に、mv 多くの場合、単にオブジェクトの名前を変更しようとしています。同じファイルシステムにある場合、内容はまったくコピーされません。

imperative_PLs/fortran をまだ持っていない場合 、次に mv 既存の fortran を使用します ディレクトリに移動し、ツリー内のそのポイントに名前を変更します。

ただし、その場所には既に (コンテンツを含む) ディレクトリがあります。名前は 1 つのオブジェクトしか参照できないため、既存のディレクトリを削除するか名前を変更する必要があります。 mv どちらもしたくないと仮定して中止します。

rsync 代わりに、個々のファイルとその他のコンテンツを fortran 内にコピーします それらを既存の imperative_PLs/fortran に入れます ディレクトリ。

rename と考えてください。 代わりに、動作がより理解しやすいように見える場合があります。


mv 実際は rename です

ファイルを別のファイルに移動する場合、mv あなたが何をしているのかを知っていると仮定して、目的のファイルを上書きします.

ディレクトリを別のディレクトリに移動する場合、mv 元のディレクトリのベース名を保持し、ターゲット ディレクトリに作成することを前提としています。宛先側にその名前のディレクトリがまだない場合、またはその名前のディレクトリが存在するが空の場合、操作は成功します。

ただし、ターゲット ディレクトリが既に存在し、空でない場合、これは rename ではなくなります。 しかし、それは再帰的なファイルとディレクトリの削除でなければなりません。 rename それを行うように設計されていないため、失敗します mv あなたがそれをしたくないと仮定して失敗するので、それ以上は進みません。


<オール>
  • mv そのように設計されていないため、この場合は機能しません。システムコールは (おそらく) どちらかです

    • 同じファイルシステムに移動:rename (元の linkunlink )
    • ファイルシステム間を移動:再帰的なファイル コピーの後に再帰的な unlink が続く
  • 意見:ない このユースケースを処理するように設計されていないためです。 1 つのことをうまく行うことを目的とした「単純な」ツールの場合、mv に示すスイッチのセットを提供する必要があります。 これらのアクション パスのどれをとるか:

    • 現在の実装のように、エラーで保釈する
    • マージするには、ファイルが既に存在する場合はエラーで救済します
    • マージするには、既存のターゲット ファイルを置き換えます
  • マージ/置換アクションが必要な場合は、 cp で簡単に実装できます 続いて rm 、またはファイル ツリー コピー ユーティリティ tar のいずれかを使用して 、 pax など


    Linux
    1. Duコマンドで–excludeを使用しますか?

    2. なぜRm-rfであり、Rmdir -rfではないのですか?

    3. 別の宛先ディレクトリに gunzip するにはどうすればよいですか?

    1. フォルダーを実行可能にする必要があるのはなぜですか?

    2. Vim でディレクトリ内のファイルの名前を変更できますか?

    3. フォーク爆弾でシステムをクラッシュできないのはなぜですか?

    1. xtermを使い続ける理由

    2. Rmが読み取り専用ファイルを削除できるのはなぜですか?

    3. ディレクトリ付きの猫ファイル?