V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
clasd2011
V2EX  ›  程序员

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

  •  1
     
  •   clasd2011 · 44 天前 · 5728 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。
    事情的经过是:执行一段脚本,由于变量为空,导致实际上执行了
    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 的进程,同时观察根目录下的文件夹,并没有缺少的,但是我不确定根目录文件夹内部的文件是否完整。大家帮我分析下,这些操作是否对系统产生影响。
    56 条回复    2025-07-28 19:04:10 +08:00
    NessajCN
        1
    NessajCN  
       44 天前
    你给的信息不足,只是你自己观察了目录有没有少,别人是观察不到的
    猜一下的话时间足够长是肯定有影响的
    newaccount
        2
    newaccount  
       44 天前   ❤️ 4
    1. 赶紧找备份
    2. 给电脑喂毒加密,推说是中毒了,痛骂病毒作者
    3. 买机票
    选吧
    xiayun
        3
    xiayun  
       44 天前
    肯定有影响 你都有 mv 成功的文件夹了······而且还掩耳盗铃似得把文件目录删了 你为啥不 mv 回去呢?
    clasd2011
        4
    clasd2011  
    OP
       44 天前
    我的理解是:
    1. mv 目录似乎是需要把根目录下的所有文件和文件夹都复制到目标目录完成了,才会去删除根目录?
    2. 假如 mv 目录是一边 mv 一边删除的,但是 mv / ./_sub 是深度优先复制的,我看到/mnt 在复制,证明根目录下的其他文件夹,要么是已经 mv 成功了,要么是还没有 mv 。但是根目录下其他文件夹都还在,证明这些文件夹还没有被 mv ,只影响/mnt 目录
    totoro52
        5
    totoro52  
       44 天前
    买张机票吧
    NessajCN
        6
    NessajCN  
       44 天前
    @clasd2011 别想当然了
    mv 是直接改目录指向,根本没有复制操作
    你要是 mv 回去了还可能救回来,直接删了是真没办法了
    clasd2011
        7
    clasd2011  
    OP
       44 天前
    @NessajCN 这里是跨文件系统了,/是系统盘,/data 是外挂的数据盘,是涉及复制的。
    Cooky
        8
    Cooky  
       44 天前
    你的程序跑不了了,该你跑了
    newaccount
        10
    newaccount  
       44 天前
    你把根目录移动到根目录下的子目录,能发生啥谁也不知道
    现在能选择的就是找个一样版本的系统,根目录对比一下,少了哪些文件夹就把里面的“文件”“复制”过去
    然后这台机器千万千万别重启
    至于 /mnt 里面什么情况,找备份听天由命吧
    每过一阵子就有人误操作,你不是唯一一个,也不会是幸运的那个,这东西做错了就认栽,别抱有不切实际的幻想
    以后记得先 cp 再 rm 就行了,这次该吃吃该喝喝想开点
    Seanfuck
        11
    Seanfuck  
       44 天前
    就算是先复制再删除,也是一个一个文件来,不是整体复制完再整体删除吧?
    SKYNE
        12
    SKYNE  
       44 天前   ❤️ 6
    脚本开头记得:set -eu
    遇到错误或未定义的变量会终止
    esee
        13
    esee  
       44 天前
    mv 跨盘了肯定是先复制再删除,但是这样也是一个文件一个文件复制再删除,而不是整体复制再整体删除。这种事没办法了。抓紧时间备份重要的数据文件吧,不然可能系统重启后就启动不起来了。,如果系统有快照试试能不能救一下。如果系统还能用凑活用就用吧,以后出问题甩锅给别人就是了。
    这种要养成好的操作习惯,不要直接 rm -f ,删除目录老老实实用 rmdir 或者 mv *** /tmp ,有些繁琐操作看着没有意义,都是在血泪中经历过来的。
    guanzhangzhang
        14
    guanzhangzhang  
       44 天前
    不要纠结原理了,先看看怎么在重启之前,把重要数据导出来备份啥的
    jifengg
        15
    jifengg  
       44 天前
    你 list 一下系统根目录/,一般第一个目录是 /bin ,然后是 /boot 。当然不排除你创建了其他更靠前的目录。
    你运行了 2 分钟左右,也许 mv 还没将首个目录移动完,那你就进第一个目录,看看这个目录下有没有缺少啥,另外如果你不是 root 运行 mv ,可能有些文件也没法 mv (万幸)。
    alen_v
        16
    alen_v  
       44 天前
    备份是唯一正解。
    msg7086
        17
    msg7086  
       44 天前   ❤️ 22
    @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
        18
    991547436  
       44 天前
    r-studio 扫下 data 看看删了什么文件名 不过 ubuntu 和 centos mv /会提示/繁忙 其他系统不知道
    skymei
        19
    skymei  
       44 天前
    我操作过,有影响,虚拟机直接就起不来了,最后新建虚拟机,重新挂在磁盘才恢复
    Huelse
        20
    Huelse  
       44 天前
    别研究了也别重启,先备份关键数据!
    wentjiang
        21
    wentjiang  
       44 天前
    我在测试环境误操作过, , 目前还在运行的软件还可以继续用, 但是如果停了再启动,就直接启动不了报错了,
    老实交代吧
    zengguibo
        22
    zengguibo  
       44 天前
    其实你中断了命令后再 mv 回去有可能修复,你 rm 后就完蛋了,赶紧备份重要的数据,找台机器替换
    skiy
        23
    skiy  
       44 天前 via iPhone
    cp -r 回去。或者 rsync 过去。
    crab
        24
    crab  
       44 天前
    你为什么选择直接删除。。
    fyq
        25
    fyq  
       44 天前   ❤️ 5
    想起一个有些年头的笑话,说为什么要装 Adobe 家的全家桶:因为输错命令删文件的时候先从 A 开始会比较久,让你有时间反应。
    byte10
        26
    byte10  
       43 天前
    先清理痕迹,history -c ,问下 ai 咋整😂
    msg7086
        27
    msg7086  
       43 天前   ❤️ 1
    省流:这种情况 kill 掉 mv 的话什么文件都不会丢,楼下可以不用浪费时间出馊主意了。
    fox0001
        28
    fox0001  
       43 天前 via Android
    @msg7086 #27 你意思,是不是 mv 先 copy 再 delete ? copy 未完成,就不会 delete ,所以根文件系统没丢失文件?
    msg7086
        29
    msg7086  
       43 天前
    @fox0001 是啊,看我 #17 的说明。
    fox0001
        30
    fox0001  
       43 天前 via Android
    @msg7086 #29 但是如果是 mv 到相同文件系统,比如同一个分区内执行 mv ,就等于修改相关文件的 meta 数据而已。这样的话,mv 的行为就不是 copy 再 delete 了。
    awker
        31
    awker  
       43 天前   ❤️ 2
    会先拷贝,在 rm 。脚本中加个 set -x 就可以看到运行过程了。
    #!/bin/bash
    set -x
    cd /data/tmp
    mv / ./_sub
    fox0001
        32
    fox0001  
       43 天前 via Android
    @msg7086 #29 不好意思,我没审题。你的回复是正确的,而且查看 mv 代码比什么猜测都强!楼主可以放心了😂😂😂
    dhb233
        33
    dhb233  
       43 天前
    用的是 mv ,不是 rm ,数据不会丢。
    可能会移动一些系统文件,mv cp 命令也没了,就不能手工恢复了,可能重启也会启动失败。不过都可以重装系统解决
    xubingok
        34
    xubingok  
       43 天前
    @msg7086 #17 我看明白了...
    人家说一个你否定一个...

    你心里已经有想要的答案了:没影响!
    la2la
        35
    la2la  
       43 天前
    趁还没有出问题,快点备份重要数据。
    zoharSoul
        36
    zoharSoul  
       43 天前
    没问题的, 具体看#17
    有些人啥都不懂在哪得吧的的
    zoharSoul
        37
    zoharSoul  
       43 天前
    @xubingok #34 脑子不好? #17 总共就回了一次, 哪来的看一个否定一个
    mazz
        38
    mazz  
       43 天前
    重启一下不就知道了吗
    chenykun123
        39
    chenykun123  
       43 天前
    @jifengg 那他都看到 mv 成功的/mnt 目录了, 这个已经比较靠后的位置了
    zh584728
        40
    zh584728  
       43 天前
    你再 mv 回来不就行了
    xubingok
        41
    xubingok  
       43 天前
    @zoharSoul #37 我把 17 楼看成 op 了....
    zoharSoul
        42
    zoharSoul  
       43 天前
    @xubingok #41 :P hah 确实比较容易看错
    WorseIsBetter
        43
    WorseIsBetter  
       43 天前   ❤️ 1
    @jifengg #15

    然而 POSIX 没有规定 readdir 返回目录项的顺序,包括 ext4 、btrfs 在内的绝大多数现代 on-disk 文件系统对此也没有任何保证。

    ls 有默认按文件名排序的行为,所以看上去是有序的。如果带上 -f 参数,会发现目录项的顺序可能没有规律(具体参考文件系统实现。比如 ext4 用的 htree 就是根据文件名 hash 排序; btrfs 则是基于 counter ,所以看到的顺序基本上是目录项的插入顺序)。

    现在回到 mv/rm 上。在批量删除的时候,没有必要对目录项排序后再操作。具体到实现上,比如 coreutils 的 remove.c 里面的实现,调用 fts_open() 时传的第三个参数是空指针,也就是不排序。你可以带 -v 参数,或者 strace 来实际验证是不是这样。

    ----

    当然这些其实并不是很重要。楼上 @msg7086 大佬的回答已经说明了没有文件会被删除,因为命令指定的根目录是 / 而不是 /*,复制没有完成,所以任何文件都不会被删除(如果是后者,就要看 shell 是如何展开的了)。除非 OP 用的不是 coreutils ,而是其他的 mv 实现,那样的话就需要另外分析了……
    Zoyo94
        44
    Zoyo94  
       43 天前
    基本报废重装吧 或者使用 ISO 镜像修复(我没试过)
    msg7086
        45
    msg7086  
       43 天前
    @WorseIsBetter
    对,关键就在于他写的是
    /
    而不是
    /*
    所以要等所有的 / 复制完才会删除。如果是 /* 由 Shell 展开成很多项,就会复制一项删除一项。
    为了避免误解造成歧义,我 #17 特意举了个 mv a b c 的例子。
    gy0624ww
        46
    gy0624ww  
       43 天前
    哎,昨天我们就是,有个同学在测试服务器 执行了 rm -f * .tar
    直接给测试环境干没了
    lzy250
        47
    lzy250  
       43 天前
    跑吧ε=ε=ε=(~ ̄▽ ̄)~
    lujiaxing
        48
    lujiaxing  
       43 天前
    跑吧ε=ε=ε=(~ ̄▽ ̄)~
    lujiaxing
        49
    lujiaxing  
       43 天前
    送楼主一首歌

    Run boy run! This world is not made for you
    Run boy run! They’re trying to catch you
    Run boy run! Running is a victory
    Run boy run! Beauty lays behind the hills
    Run boy run! The sun will be guiding you
    Run boy run! They’re dying to stop you
    Run boy run! This race is a prophecy
    Run boy run! Break out from society
    Tomorrow is another day
    And you won’t have to hide away
    You’ll be a man, boy!
    ryd994
        50
    ryd994  
       43 天前 via Android
    先备份数据。剩下的你随便怎么搞。大不了重装系统。只要数据还在就一切都有救。
    wenkgin
        51
    wenkgin  
       42 天前
    @Cooky 哥们儿,肚子都给我笑痛,哈哈哈哈哈
    listenerri
        52
    listenerri  
       42 天前 via Android
    op 回来说一下最后结果?
    workingpad2
        53
    workingpad2  
       42 天前
    luck = 1/(seconds^2)
    sunzhenyucn
        54
    sunzhenyucn  
       42 天前
    run
    xomix
        55
    xomix  
       42 天前
    不知道 Linux 下如何处理,微软系的处理方式一直是没有完成复制之前是不会修改原始位置的文件的(也就是移动文件没完成复制动作不会删除)。
    Linux 下我没见过类似的文件,你需要自己去找资料了。
    clasd2011
        56
    clasd2011  
    OP
       37 天前
    目前什么都没有发生,也许未来机器重启了,就知道最终结果了。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3362 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:52 · PVG 12:52 · LAX 21:52 · JFK 00:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.