尝试移动某些文件夹时出现错误:“无法移动文件已存在”
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
创建链接而不是副本的选项,那么rsync
或pax
就足够了
答案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