我有一个将应用程序部署到临时服务器的 shell 脚本。但是,应用程序的目录之一需要在部署后备份和恢复(以免被覆盖)。我设法备份了目录,但恢复部分没有按预期运行。基本上,以下是 shell 脚本中的两行:
...
# backup user avatars
mv vitex/app/modules/users/pub/img/users/ ~/tmp/img-users.BAK/ &> /dev/null
...
# restore user avatars
mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/ &> /dev/null
问题是第一个命令在下创建了正确的文件夹~/tmp/
,但第二个命令创建了vitex/app/modules/users/pub/img/users/img-users.BAK/
,这并不好。
预期的行为是img-users.BAK
将所有文件移回,覆盖目标文件夹中的所有文件,而其他文件保持不变。
如何才能做到这一点?
谢谢!
笔记:由于该路径下没有目录,因此递归不是必需的。
** 编辑 **
步骤 1:备份目录
前
./vitex/app/modules/users/pub/img/
./users/
./1.png
./14.png
./README
...
./tmp/
<empty>
后
./vitex/app/modules/users/pub/img/
<empty>
./tmp/
./img-users.BAK/
./1.png
./14.png
./README
...
一切都正如预期。
第 2 步:恢复目录
前
./vitex/app/modules/users/pub/img/
./users/
./1.png
./3.png
./README
...
./tmp/
./img-users.BAK/
./1.png
./14.png
./README
...
后 (实际的)
./vitex/app/modules/users/pub/img/
./users/
./img-users.BAK/
./1.png
./14.png
./README
...
./3.png
./1.png
./README
...
./tmp/
<empty>
后 (预期的)
./vitex/app/modules/users/pub/img/
./users/
./1.png <-- overwritten
./14.png
./3.png
./README <-- overwritten
...
./tmp/
<empty>
答案1
你发出的命令正在做正确的事情,即移动目录。如果您需要移动或复制文件在img/users
目录后面,然后明确地执行:
mv -f ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/
请注意,我添加了 ,-f
这将强制覆盖而不询问。请小心。另外,不确定你为什么要丢弃 STDOUT,所以我也将其去掉了。
答案2
区别在于,在第一种情况下,目的地不存在,而在第二种情况下,目的地已经存在。
mv ~/tmp/img-users.BAK/ vitex/app/modules/users/pub/img/users/
第二条命令将除最后几个文件之外的所有文件移动到最后一个目录,因此您需要列出要移动的所有文件。您可以使用通配符来做到这一点:
mv ~/tmp/img-users.BAK/* vitex/app/modules/users/pub/img/users/
作为一个(重要的)附注,你应该避免/
在源目录末尾有一个。它可能会产生非常奇怪的副作用,而且无论如何也没多大用处:
从pinfo mv
:
**Warning**: Avoid specifying a source name with a trailing slash,
when it might be a symlink to a directory. Otherwise, `mv' may do
something very surprising, since its behavior depends on the underlying
rename system call. On a system with a modern Linux-based kernel, it
fails with `errno=ENOTDIR'. However, on other systems (at least
FreeBSD 6.1 and Solaris 10) it silently renames not the symlink but
rather the directory referenced by the symlink.
答案3
如果备份和恢复之间的中间阶段是重新创建目录users
(似乎是这种情况),那么要恢复它,您需要重命名单个文件(如前面的答案所示,尽管我认为这可能不是您想要的),或者在脚本中restore
,users
在将目录移回原位之前删除它,因此backup
保持不变(除了考虑 Volker Siegel 在答案中提到的尾部斜杠问题):
...
# backup user avatars
mv vitex/app/modules/users/pub/img/users ~/tmp/img-users.BAK
您可以添加一个命令到restore
,例如:
...
# restore user avatars
rm -rf vitex/app/modules/users/pub/img/users
mv ~/tmp/img-users.BAK vitex/app/modules/users/pub/img/users
我还删除了重定向到/dev/null
,因为我认为在典型情况下你不需要它(mv 将会保持沉默),而如果发生一些奇怪的事情,你会收到可能有助于弄清楚发生了什么的错误消息。