在我把打开 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++ Alt)L并暗示“不太好的人”数据丢失不是一个很好的新年礼物;-)
答案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} /