在 Linux 中不小心执行了 mv / ./_sub 命令,命令没有执行完毕,人为中断了,会有影响吗?

102 天前
 clasd2011
事情的经过是:执行一段脚本,由于变量为空,导致实际上执行了
cd /data/tmp
mv / ./_sub
(其中/data 是外挂的数据盘,/是系统盘)

一两分钟后,发现脚本有问题,这时还没有意识到执行了错误的 mv 命令,于是 rm -rf /data/tmp 删除了目录(注意,这个时候可能/data/tmp/_sub/下有已经 mv 成功的文件夹,但是被我删掉了,也不知道是什么了)。

然后重建目录,准备执行修改后的脚本:mkdir -p /data/tmp

这时发现/data/tmp/_sub 目录下居然有东西,是 mnt 文件夹,还在持续复制中。

这个时候我 kill 掉了 mv 的进程,同时观察根目录下的文件夹,并没有缺少的,但是我不确定根目录文件夹内部的文件是否完整。大家帮我分析下,这些操作是否对系统产生影响。
5912 次点击
所在节点    程序员
56 条回复
NessajCN
102 天前
你给的信息不足,只是你自己观察了目录有没有少,别人是观察不到的
猜一下的话时间足够长是肯定有影响的
newaccount
102 天前
1. 赶紧找备份
2. 给电脑喂毒加密,推说是中毒了,痛骂病毒作者
3. 买机票
选吧
xiayun
102 天前
肯定有影响 你都有 mv 成功的文件夹了······而且还掩耳盗铃似得把文件目录删了 你为啥不 mv 回去呢?
clasd2011
102 天前
我的理解是:
1. mv 目录似乎是需要把根目录下的所有文件和文件夹都复制到目标目录完成了,才会去删除根目录?
2. 假如 mv 目录是一边 mv 一边删除的,但是 mv / ./_sub 是深度优先复制的,我看到/mnt 在复制,证明根目录下的其他文件夹,要么是已经 mv 成功了,要么是还没有 mv 。但是根目录下其他文件夹都还在,证明这些文件夹还没有被 mv ,只影响/mnt 目录
MIUIOS
102 天前
买张机票吧
NessajCN
102 天前
@clasd2011 别想当然了
mv 是直接改目录指向,根本没有复制操作
你要是 mv 回去了还可能救回来,直接删了是真没办法了
clasd2011
102 天前
@NessajCN 这里是跨文件系统了,/是系统盘,/data 是外挂的数据盘,是涉及复制的。
Cooky
102 天前
你的程序跑不了了,该你跑了
clasd2011
102 天前
newaccount
102 天前
你把根目录移动到根目录下的子目录,能发生啥谁也不知道
现在能选择的就是找个一样版本的系统,根目录对比一下,少了哪些文件夹就把里面的“文件”“复制”过去
然后这台机器千万千万别重启
至于 /mnt 里面什么情况,找备份听天由命吧
每过一阵子就有人误操作,你不是唯一一个,也不会是幸运的那个,这东西做错了就认栽,别抱有不切实际的幻想
以后记得先 cp 再 rm 就行了,这次该吃吃该喝喝想开点
Seanfuck
102 天前
就算是先复制再删除,也是一个一个文件来,不是整体复制完再整体删除吧?
SKYNE
102 天前
脚本开头记得:set -eu
遇到错误或未定义的变量会终止
esee
102 天前
mv 跨盘了肯定是先复制再删除,但是这样也是一个文件一个文件复制再删除,而不是整体复制再整体删除。这种事没办法了。抓紧时间备份重要的数据文件吧,不然可能系统重启后就启动不起来了。,如果系统有快照试试能不能救一下。如果系统还能用凑活用就用吧,以后出问题甩锅给别人就是了。
这种要养成好的操作习惯,不要直接 rm -f ,删除目录老老实实用 rmdir 或者 mv *** /tmp ,有些繁琐操作看着没有意义,都是在血泪中经历过来的。
guanzhangzhang
102 天前
不要纠结原理了,先看看怎么在重启之前,把重要数据导出来备份啥的
jifengg
102 天前
你 list 一下系统根目录/,一般第一个目录是 /bin ,然后是 /boot 。当然不排除你创建了其他更靠前的目录。
你运行了 2 分钟左右,也许 mv 还没将首个目录移动完,那你就进第一个目录,看看这个目录下有没有缺少啥,另外如果你不是 root 运行 mv ,可能有些文件也没法 mv (万幸)。
alen_v
102 天前
备份是唯一正解。
msg7086
102 天前
@NessajCN #6 跨文件系统是每个源项目全部复制完再删除。

@Seanfuck @esee
源码可以自己看:
https://github.com/coreutils/coreutils/blob/master/src/mv.c#L169

先尝试执行改名,改名不成功就把整个源复制到目标,全部复制完成后删除原始文件。

比如 mv a b c
先复制 a 到 c/a ,然后删除 a ,然后复制 b 到 c/b ,然后删除 b 。

楼主是复制/,所以要等整个/全部复制完以后才会删除原来的文件。
991547436
102 天前
r-studio 扫下 data 看看删了什么文件名 不过 ubuntu 和 centos mv /会提示/繁忙 其他系统不知道
skymei
102 天前
我操作过,有影响,虚拟机直接就起不来了,最后新建虚拟机,重新挂在磁盘才恢复
Huelse
102 天前
别研究了也别重启,先备份关键数据!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1146783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX