mv:「ファイルが存在します」を移動できません。

mv:「ファイルが存在します」を移動できません。

エラー:一部のフォルダを移動しようとすると、「既に存在するファイルを移動できません」

export BACKUP_DIR=/backup
mv -f $BACKUP_DIR/scripts $BACKUP_DIR/scripts_old

エラーが発生しました:

mv: cannot move '/backup/scripts' to '/backup/scripts_old/scripts': File exists

そのオプションを試してみましたが、-fオプションなしで使用しても同じでした。同じエラーが発生しました。これはどのように移動できますか?

ありがとうございます!

答え1

既存のディレクトリとを組み合わせることはできませんmvscriptsこのエラーメッセージは/backup/scripts_old

しかし、できることは、ファイルをコピー/リンクしてからソースからリンクされたファイルを削除することです。このソリューションにはGNU(非POSIX)が必要で、cpソースとターゲットが同じファイルシステムにある場合にのみ機能します。

BACKUP_DIR=/backup
cp -al "$BACKUP_DIR"/scripts/. "$BACKUP_DIR"/scripts_old/scripts
find "$BACKUP_DIR"/scripts -type f -links 2 -print

ノート

  • .ソースの末尾のポイントのコピー()必須です
  • -print満足のいくものに変更すると、-deleteソースから正しいファイルが削除されます。
  • 変数を使用するときは二重引用符を使用してください(そうでない場合は、名前にスペースが含まれているディレクトリはコードを深刻に破損させます)。
  • cpGNUがコピーの代わりにリンクを作成するオプションを提供しない場合は十分ですrsyncpax

答え2

このmvコマンドは非常に危険な操作なので、ディレクトリの交換はサポートされません。誤ってこれを行うと、ターゲットディレクトリのすべてのデータが失われます。

2つのフォルダをマージしたくない場合は、$BACKUP_DIR/scripts_old/scriptsmvを試す前にターゲットフォルダの名前を変更または削除する必要があります。この問題を解決する方法はありません。

オプションは次のとおりです。

  • まず、ターゲットディレクトリを削除してください。
  • ソースディレクトリをターゲットディレクトリに配置します。$BACKUP_DIR/scripts_old/scripts/scripts
  • ソースまたはターゲットディレクトリの名前を変更します。$BACKUP_DIR/scripts_old/scripts1
  • ディレクトリのマージ(ただし、これがファイルを上書きしたり、追加のディレクトリの競合を引き起こす可能性があります)mv scripts/* $BACKUP_DIR/scripts_old/scripts/*(または他の回答で検索と同様の操作を実行)
  • rsyncなどのツールを使用して、ターゲットディレクトリのファイルをソースディレクトリのファイルに置き換え、オプションでソースディレクトリを削除するか、ソースディレクトリの代わりにターゲットディレクトリの内容を削除します(おそらく最も遅いオプション)

そのようなバックアップディレクトリが必要な理由は実際には説明しません。おそらく、バックアップディレクトリをまったく使用せずにgitなどのバージョン管理ツールを使用する方が良いかもしれません。

答え3

個別に削除せずにこれを行うことはできないと思います。

rsync a)ソースファイル(ファイルのみ)の削除--remove-source-filesとb)ソースに存在しないターゲットファイルの削除(--delete)を許可します。-nv詳細な練習のために一緒に使用するのが最善です。バージョンによってはrsync循環-r性が必要な場合があります。

それにもかかわらず、まだ空のディレクトリツリーが残りsource、 で言及されていないディレクトリはsource変更されていませんtarget

簡単に言えば、2つのコマンドを使用する最も簡単なオプションは次のとおりです。

rm "$BACKUP_DIR"/scripts_old &&
mv "$BACKUP_DIR"/scripts "$BACKUP_DIR"/scripts_old

関連情報