Unixでmvと{cp + rm the old file}の間に違いはありますか?


13
  • mv a b

  • cp a b;rm a

これらは2組のステートメントです。彼らは何をするのか何か違いはありますか?


1
原子性?ただし、mvコマンドがアトミックかどうかはわかりません。
アドリアーノヴァロリ広場

はい。なぜ聞くのですか?

1
現在、+ にmv似ていますが、前者はファイルシステム間移動(その後は+になります)に対して機能し、後者は失敗します(ファイルシステム間ハードリンクをサポートしません)。lnrmcprmln
クリスジェスターヤング

毎日が学校の日です-このデフォルトの動作をオーバーライドする方法を知りたい人は、--remove-destinationスイッチ が必要です-stackoverflow.com/a/9371263/409638
ロバート

回答:


20

関係するファイルが同じファイルシステム上にあると仮定すると、mvは単にファイルシステム内のポインターを変更しますが、cpはファイルの内容全体をコピーし、rmは再びポインターを変更します。したがって、mvははるかに効率的です。


しかし、彼らはまったく同じことをしますよね?
レーザー

8
いいえ、そうではありません。

2
@eSKay:いいえ。2つのシナリオ:1.ターゲットが存在しません。mvファイルの名前を変更するだけです(元のファイルと同じiノード)。cp新しいファイルの新しいiノードを作成します。2.ターゲットは存在します。mvターゲットファイルのリンクを解除(削除)し、1つの手順で名前を変更します。cpターゲットファイルのiノードを上書きします。
クリスジェスターヤング

7
また、mv許可または所有権を変更しないでください。友人のホームディレクトリから自分のホームディレクトリにファイルを移動したいと想像してください。もしそうならmv、あなたはあなたのホームディレクトリにあなたの仲間に属するファイルで終わるでしょう。あなたがすることはできませんchownか、chmodと権限に応じても、それを変更したり、読んでいません。あなたがファイルをcp追跡するとrm、あなたに属し、すべてがうまくいきます。
ルートヴィヒワインツィール

9

はい、mvは同じディスク上でアトミックになる可能性がありますが、cpとrmの組み合わせにはありません。

これは、mvがrename()保証付きの呼び出しであるを使用して実装されていることを前提としています。たとえば、POSIXを引用しているこのニュースグループの投稿を参照してください。

このrename()関数は、通常のファイルの場合、ISO C標準で定義されているものと同等です。ここに含めると、その定義が展開され、ディレクトリに対するアクションが含まれ、新しいパラメーターが既存のファイルに名前を付けるときの動作が指定されます。その仕様では、関数のアクションがアトミックであることが必要です。


7

同じファイルシステムで、mvはディレクトリ参照を変更し、同じiノード(ファイルデータとメタデータ)を指すようにします。

  • アトミック操作です(別のプロセスファイル操作によって中断することはできません)
  • 取るに足らない量の追加のディスク領域(ディレクトリ内の追加の名前)のみを取ります
  • ファイルの許可と所有権を保持します
  • データの量に応じて、はるかに高速になります

コピーして削除

  • アトミックではありません(別のプロセスがcpコマンドとrmコマンドの間に干渉する可能性があります)
  • 短時間(cpコマンドとrmコマンドの間)にファイルデータをディスクに2回保存する必要があります。
  • ファイルの許可と所有権をデフォルトに変更します
  • データの量に応じて、はるかに遅くなるか、失敗することさえあります

4

ソースとデスティネーションが同じ物理ボリューム上にある場合、最初のアプローチは単なる名前変更であり、非常に高速です(ファイルが非常に大きい場合でも)。

cprmは、必要ではない場合でも、常にすべてのデータをロード/保存する必要があります。


3

mvは本質的に「名前変更」操作です。これは、ファイル自体がディスク上の同じ場所に残っていることを意味します。実際のファイル操作は実行されません。


2

はい。

mvは、ファイルのファイルシステムメタデータをその名前と場所に関連して単に変更しますが、cpはファイルの別個のコピーを作成します。


2

cpとrmはディスク使用量がはるかに多く、ディスク容量の理由で失敗する可能性があります。


2

違いは、mvはファイル属性を保存しますが、cpはデフォルトでは保存しないことです。たとえば、作成日を現在の日付に設定します。

このデフォルトをオーバーライドするには、「cp -p」を使用して、最後のデータ変更、最後のアクセス時刻、ユーザーIDおよびグループID(これを行う権限がある場合のみ)、ファイル許可ビット、SUIDおよびSGIDを保持しますビット。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.