Linux 中移动文件夹不一致

Linux 中移动文件夹不一致

我有一个将应用程序部署到临时服务器的 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(似乎是这种情况),那么要恢复它,您需要重命名单个文件(如前面的答案所示,尽管我认为这可能不是您想要的),或者在脚本中restoreusers在将目录移回原位之前删除它,因此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 将会保持沉默),而如果发生一些奇怪的事情,你会收到可能有助于弄清楚发生了什么的错误消息。

相关内容