mv
「フォルダ」というフォルダをすでに「フォルダ」を含むディレクトリに移動すると、そのフォルダはマージまたは置き換えられますか?
ベストアンサー1
mv
ディレクトリはマージまたは上書きできません。メッセージで失敗します。"mv: 'a' を 'b' に移動できません: ディレクトリが空ではありません。"、このオプションを使用する場合も同様です--force
。
この問題を解決するには、他のツール(たとえばrsync
、find
またはさらにcp
)を使用できますが、次の意味を慎重に検討する必要があります。
rsync
あるディレクトリの内容を別のディレクトリにマージすることができます(理想的には、正常に送信されたソースファイルのみを安全に削除するには、オプション--remove-source-files
1を-a
使用し、必要に応じて一般的な権限/所有権/時間保存オプションも使用します)
...しかし、これは完全なコピー操作なので、ディスク容量を大量に消費できます。- あなたはそれを使用することができます
find
ターゲットでソースディレクトリ構造を順次再作成し、物理ファイルを個別に移動します
。しかし、これはソースで複数回繰り返される必要があり、競合状態が発生する可能性があります(マルチステッププロセス中にソースに新しいディレクトリを作成します)。 cp
ハードリンク生成可能(単純に同じ既存のファイルへの追加のポインタ)マージと非常によく似た結果を生成しますmv
(実際のデータをコピーせずにポインタのみを生成するため、IO効率的です)
。しかし、これは競合状態のために再び困難になります(ソースの新しいファイルは前のステップでコピーされていなくても削除されます)。(注:rsyncからはもう機能しません。バージョン 3.2.6)rsync
オプションを組み合わせて--link-dest=DIR
(ファイルの内容をコピーするのではなく、可能であればハードリンクを作成)、--remove-source-files
通常のパスと同じにすることができますmv
。
これには--link-dest
絶対パスを提供する必要があります。源泉ディレクトリ(または相対パス目的地到着源泉)。
…しかし、これは--link-dest
予期しない方法で使用され(複雑さを引き起こす可能性がありますが、そうでない場合があります)、ソースへの絶対パスを知る必要があります(または決定する必要があります)(引数として)、空のディレクトリ構造を残します--link-dest
。進みます。 。
これらの回避策(ある場合)のどちらが適切かは、特定のユースケースによって大きく異なります。
いつものように、これらのコマンドを実行する前に2回考えてバックアップを作成してください。
1:ディレクトリは削除されないため、空のソースディレクトリツリーを削除するには、次のrsync --remove-source-files
作業を行う必要があります。find -depth -type d -empty -delete