mv a bcp a b;rm a
これらは2組のステートメントです。彼らは何をするのか何か違いはありますか?
mv似ていますが、前者はファイルシステム間移動(その後は+になります)に対して機能し、後者は失敗します(ファイルシステム間ハードリンクをサポートしません)。lnrmcprmln
--remove-destinationスイッチ が必要です-stackoverflow.com/a/9371263/409638
mv a b
cp a b;rm a
これらは2組のステートメントです。彼らは何をするのか何か違いはありますか?
mv似ていますが、前者はファイルシステム間移動(その後は+になります)に対して機能し、後者は失敗します(ファイルシステム間ハードリンクをサポートしません)。lnrmcprmln
--remove-destinationスイッチ が必要です-stackoverflow.com/a/9371263/409638
回答:
関係するファイルが同じファイルシステム上にあると仮定すると、mvは単にファイルシステム内のポインターを変更しますが、cpはファイルの内容全体をコピーし、rmは再びポインターを変更します。したがって、mvははるかに効率的です。
mvファイルの名前を変更するだけです(元のファイルと同じiノード)。cp新しいファイルの新しいiノードを作成します。2.ターゲットは存在します。mvターゲットファイルのリンクを解除(削除)し、1つの手順で名前を変更します。cpターゲットファイルのiノードを上書きします。
mv許可または所有権を変更しないでください。友人のホームディレクトリから自分のホームディレクトリにファイルを移動したいと想像してください。もしそうならmv、あなたはあなたのホームディレクトリにあなたの仲間に属するファイルで終わるでしょう。あなたがすることはできませんchownか、chmodと権限に応じても、それを変更したり、読んでいません。あなたがファイルをcp追跡するとrm、あなたに属し、すべてがうまくいきます。
はい、mvは同じディスク上でアトミックになる可能性がありますが、cpとrmの組み合わせにはありません。
これは、mvがrename()保証付きの呼び出しであるを使用して実装されていることを前提としています。たとえば、POSIXを引用しているこのニュースグループの投稿を参照してください。
このrename()関数は、通常のファイルの場合、ISO C標準で定義されているものと同等です。ここに含めると、その定義が展開され、ディレクトリに対するアクションが含まれ、新しいパラメーターが既存のファイルに名前を付けるときの動作が指定されます。その仕様では、関数のアクションがアトミックであることが必要です。
同じファイルシステムで、mvはディレクトリ参照を変更し、同じiノード(ファイルデータとメタデータ)を指すようにします。
コピーして削除
mvは本質的に「名前変更」操作です。これは、ファイル自体がディスク上の同じ場所に残っていることを意味します。実際のファイル操作は実行されません。