mvを使ってフォルダをマージしますか?

mvを使ってフォルダをマージしますか?

mv「フォルダ」というフォルダをすでに「フォルダ」を含むディレクトリに移動すると、そのフォルダはマージまたは置き換えられますか?

ベストアンサー1

mvディレクトリはマージまたは上書きできません。メッセージで失敗します。"mv: 'a' を 'b' に移動できません: ディレクトリが空ではありません。"、このオプションを使用する場合も同様です--force


この問題を解決するには、他のツール(たとえばrsyncfindまたはさらにcp)を使用できますが、次の意味を慎重に検討する必要があります。

  • rsyncあるディレクトリの内容を別のディレクトリにマージすることができます(理想的には、正常に送信されたソースファイルのみを安全に削除するには、オプション--remove-source-files1を-a使用し、必要に応じて一般的な権限/所有権/時間保存オプションも使用します)
    ...しかし、これは完全なコピー操作なので、ディスク容量を大量に消費できます。
  • あなたはそれを使用することができますfindターゲットでソースディレクトリ構造を順次再作成し、物理ファイルを個別に移動します
    しかし、これはソースで複数回繰り返される必要があり、競合状態が発生する可能性があります(マルチステッププロセス中にソースに新しいディレクトリを作成します)。
  • cpハードリンク生成可能(単純に同じ既存のファイルへの追加のポインタ)マージと非常によく似た結果を生成しますmv(実際のデータをコピーせずにポインタのみを生成するため、IO効率的です)
    しかし、これは競合状態のために再び困難になります(ソースの新しいファイルは前のステップでコピーされていなくても削除されます)。
  • rsyncオプションを組み合わせて--link-dest=DIR(ファイルの内容をコピーするのではなく、可能であればハードリンクを作成)、--remove-source-files通常のパスと同じにすることができますmv
    これには--link-dest絶対パスを提供する必要があります。源泉ディレクトリ(または相対パス目的地到着源泉)。
    しかし、これは--link-dest予期しない方法で使用され(複雑さを引き起こす可能性がありますが、そうでない場合があります)、ソースへの絶対パスを知る必要があります(または決定する必要があります)(引数として)、空のディレクトリ構造を残します--link-dest。進みます。 。
    (注:rsyncからはもう機能しません。バージョン 3.2.6)

これらの回避策(ある場合)のどちらが適切かは、特定のユースケースによって大きく異なります。
いつものように、これらのコマンドを実行する前に2回考えてバックアップを作成してください。


1:ディレクトリは削除されないため、空のソースディレクトリツリーを削除するには、次のrsync --remove-source-files作業を行う必要があります。find -depth -type d -empty -delete

おすすめ記事