修复“mv /* ../”之后

修复“mv /* ../”之后

在我把打开 root shell 的笔记本电脑放在桌子上(运行 ubuntu 13.10)后,一些不太友善的人使用“mv /* ../”破坏了我的系统

有什么简单的方法可以解决这个问题,或者我最好保存可以保存的内容并重新格式化?

答案1

现在,我不是命令专家,但这似乎是一个令人讨厌的命令(无论如何,为什么要让一台打开的机器处于根用户状态?)。

如果文件仍在系统中(不太可能),您应该能够将它们移回。但是既然您问了这个问题,我认为它们不在系统中。

我最好的选择是重新安装系统。

并告诉自己永远不要再离开单独的 ROOT 系统。:P

答案2

在大多数情况下,撤销错误的移动其实相对容易。该命令mv /* ../将顶级目录下的每个非隐藏文件移动到当前工作目录

如果您以 root 身份登录,则/root默认为当前工作目录。在这种情况下,该命令mv /* ../不会产生任何效果,因为它实际上被转换为mv /* /

既然您提到“您的系统已损坏”,我认为您运气不好,您当前的目录没有损坏/root(或任何带有父目录 的目录都没有损坏/)。假设您在目录中/var/www。现在,这意味着所有文件都已移动到目录/var/

由于所有程序都无法启动(库无法访问,程序也损坏了),我建议启动 Live CD 并继续恢复。在以下命令中,$ROOT用您的 Ubuntu 安装的挂载点替换(例如/media/Ubuntu)。

我们来看看根目录中包含什么:

$ ls $ROOT
bin
boot
dev
etc
home
initrd.img    # symlink to /boot/initrd.img-3.8.0-34-generic
lib
lib32
lib64
lost+found    # special directory for ext filesystems, cannot be moved
media
mnt
opt
proc
root
run
sbin
selinux
srv
sys
tmp
usr
var
vmlinuz    # symlink to boot/vmlinuz-3.8.0-34-generic

glob 模式/*被 shell 扩展,因此命令变成如下形式:

mv /bin /boot (stripped for saving space) /usr /var /vmlinuz  /var/

如果/var/不包含 中的任何名称/,那么您可以简单地将其移回。假设您当前的工作目录是/var( cd /var),您可以运行:

mv bin boot (stripped for saving space) usr var vmlinuz $ROOT/

或者一个接一个地做:

mv bin $ROOT/
mv boot $ROOT/
...
mv var $ROOT/
mv vmlinuz $ROOT/

特别案例:

  • 当 中的目录/var/与 中的目录同名时/,则该目录为不是/run/移动。这是和的情况/var/run/

这里不适用但为了完整性而提及的特殊情况:

  • 当 中的目录/var/与 中的项目同名/(目录、文件、符号链接等)时, 中的项目/将被移动到 的目录中/var/NAME。例如,如果/NAME是文件或目录,/var/NAME/是目录,/NAME则将被移动到/var/NAME/NAME
  • 如果/var/NAME是文件并且/NAME也是文件,则将/var/NAME被覆盖/NAME。恢复在这里并不那么容易,因为您现在需要取证工具。
  • /var/NAME是文件并且/NAME是目录时,什么都不会发生(并且会打印一条错误消息)。

下次不要忘记锁定屏幕(Ctrl++ AltL并暗示“不太好的人”数据丢失不是一个很好的新年礼物;-)

答案3

这取决于你的根 shell 在哪个目录中打开。该命令mv /* ../会将文件夹中的所有内容移动/到你的当前的目录。

现在,您面临的主要问题是,由于/bin现在将为, 所以没有命令可以工作/home/bin(假设您的 root shell 的工作目录是您的$HOME)。只需启动实时会话、安装本地驱动器并将文件移回,即可轻松解决此问题。

您也可以尝试运行/home/bin/ls /home。如果显示类似/usr和 的文件夹/etc,则说明/文件已移动到 /home`,您可以通过运行(从打开的 root shell)将它们取回:

/home/bin/mv /home/{bin,boot,dev,etc,lib,lib32,lib64,media,mnt,opt,proc,root,run,sbin,srv,sys,tmp,usr,var} /

相关内容