エラー:一部のフォルダを移動しようとすると、「既に存在するファイルを移動できません」
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
既存のディレクトリとを組み合わせることはできませんmv
。scripts
このエラーメッセージは/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
ソースから正しいファイルが削除されます。- 変数を使用するときは二重引用符を使用してください(そうでない場合は、名前にスペースが含まれているディレクトリはコードを深刻に破損させます)。
cp
GNUがコピーの代わりにリンクを作成するオプションを提供しない場合は十分ですrsync
。pax
答え2
このmv
コマンドは非常に危険な操作なので、ディレクトリの交換はサポートされません。誤ってこれを行うと、ターゲットディレクトリのすべてのデータが失われます。
2つのフォルダをマージしたくない場合は、$BACKUP_DIR/scripts_old/scripts
mvを試す前にターゲットフォルダの名前を変更または削除する必要があります。この問題を解決する方法はありません。
オプションは次のとおりです。
- まず、ターゲットディレクトリを削除してください。
- ソースディレクトリをターゲットディレクトリに配置します。
$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