mv
を使用する場合 「folder」というフォルダを「folder」がすでに含まれているディレクトリに移動すると、それらはマージされますか、それとも置き換えられますか?
承認された回答:
mv
ディレクトリをマージまたは上書きできません。「mv:「a」を「b」に移動できません:ディレクトリが空ではありません」というメッセージが表示されて失敗します 、--force
を使用している場合でも オプション。
他のツール(rsync
など)を使用してこれを回避できます 、find
、またはcp
)、ただし、その影響を慎重に検討する必要があります:
-
rsync
あるディレクトリの内容を別のディレクトリにマージできます(理想的には--remove-source-files
を使用) 正常に転送されたソースファイルのみを安全に削除するオプションで、通常の権限/所有権/時間保存オプション-a
必要に応じて)
…しかし これはフルコピー操作であるため、ディスクを大量に消費する可能性があります。 - 現在推奨されているオプション:
rsync
を組み合わせることができます の--link-dest=DIR
オプション(可能な場合はファイルの内容をコピーする代わりにハードリンクを作成する)および--remove-source-files
通常のmv
と非常によく似たセマンティックを取得します 。
このために、--link-dest
ソースへの絶対パスを指定する必要があります ディレクトリ(または宛先からの相対パス ソースへ )。
…しかし これは--link-dest
を使用しています 意図しない方法で(複雑になる場合と引き起こさない場合があります)、ソースへの絶対パスを知る(または決定する)必要があります(--link-dest
への引数として) )、そして再び空のディレクトリ構造を残して、に従ってクリーンアップします。 -
find
を使用できます ターゲットでソースディレクトリ構造を順番に再作成してから、実際のファイルを個別に移動します
…しかし これはソースを複数回繰り返す必要があり、競合状態が発生する可能性があります(マルチステッププロセス中にソースで新しいディレクトリが作成されます) -
cp
ハードリンク(簡単に言えば、同じ既存のファイルへの追加のポインタ)を作成できます。これにより、mv
のマージと非常によく似た結果が作成されます。 (ポインタのみが作成され、実際のデータをコピーする必要がないため、IO効率が非常に高くなります)
…しかし これも競合状態の可能性があります(前の手順でコピーされていなくても、ソースの新しいファイルが削除されます)
これらの回避策(ある場合)のどれが適切かは、特定のユースケースに大きく依存します。
いつものように、これらのコマンドのいずれかを実行する前に考えて、バックアップを作成してください。
1:rsync --remove-source-files
に注意してください ディレクトリは削除されないため、find -depth -type d -empty -delete
のような操作を行う必要があります。 その後、空のソースディレクトリツリーを削除します。