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

您不能将现有目录与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当您满意时它将从源中删除正确的文件
  • 使用变量时用双引号引起来(否则名称中带有空格的目录将严重破坏您的代码)
  • 如果 GNU 没有提供cp创建链接而不是副本的选项,那么rsyncpax就足够了

答案2

mv命令不支持替换目录,因为这是一个非常危险的操作。如果您不小心这样做,您将丢失目标目录中的所有数据。

如果您不想合并这两个文件夹,则必须$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可能需要 ecursivity。

尽管如此,您仍将保留空目录树source,并且 中未提及的目录source将保持不变target

长话短说:使用两个命令,最简单的选项是:

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

相关内容