• 请不要在回答技术问题时复制粘贴 AI 生成的内容
clasd2011
V2EX  ›  程序员

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

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

    你心里已经有想要的答案了:没影响!
    la2la
    la2la
    Jul 22, 2025
    35
    趁还没有出问题,快点备份重要数据。
    zoharSoul
    zoharSoul
    Jul 22, 2025
    36
    没问题的, 具体看#17
    有些人啥都不懂在哪得吧的的
    zoharSoul
    zoharSoul
    Jul 22, 2025
    37
    @xubingok #34 脑子不好? #17 总共就回了一次, 哪来的看一个否定一个
    codermz
    codermz
    Jul 22, 2025
    38
    重启一下不就知道了吗
    chenykun123
    chenykun123
    Jul 22, 2025
    39
    @jifengg 那他都看到 mv 成功的/mnt 目录了, 这个已经比较靠后的位置了
    LuJason
    LuJason
    Jul 22, 2025
    40
    你再 mv 回来不就行了
    BruceXu
    BruceXu
    Jul 22, 2025
    41
    @zoharSoul #37 我把 17 楼看成 op 了....
    zoharSoul
    zoharSoul
    Jul 22, 2025
    42
    @xubingok #41 :P hah 确实比较容易看错
    WorseIsBetter
    WorseIsBetter
    Jul 22, 2025❤️1
    43
    @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
    Zoyo94
    Jul 22, 2025
    44
    基本报废重装吧 或者使用 ISO 镜像修复(我没试过)
    msg7086
    msg7086
    Jul 22, 2025
    45
    @WorseIsBetter
    对,关键就在于他写的是
    /
    而不是
    /*
    所以要等所有的 / 复制完才会删除。如果是 /* 由 Shell 展开成很多项,就会复制一项删除一项。
    为了避免误解造成歧义,我 #17 特意举了个 mv a b c 的例子。
    gy0624ww
    gy0624ww
    Jul 22, 2025
    46
    哎,昨天我们就是,有个同学在测试服务器 执行了 rm -f * .tar
    直接给测试环境干没了
    lzy250
    lzy250
    Jul 22, 2025
    47
    跑吧ε=ε=ε=(~ ̄▽ ̄)~
    lujiaxing
    lujiaxing
    Jul 22, 2025
    48
    跑吧ε=ε=ε=(~ ̄▽ ̄)~
    lujiaxing
    lujiaxing
    Jul 22, 2025
    49
    送楼主一首歌

    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
    ryd994
    Jul 22, 2025 via Android
    50
    先备份数据。剩下的你随便怎么搞。大不了重装系统。只要数据还在就一切都有救。
    wenkgin
    wenkgin
    Jul 23, 2025
    51
    @Cooky 哥们儿,肚子都给我笑痛,哈哈哈哈哈
    listenerri
    listenerri
    Jul 23, 2025 via Android
    52
    op 回来说一下最后结果?
    workingpad2
    workingpad2
    Jul 23, 2025
    53
    luck = 1/(seconds^2)
    yaidev
    yaidev
    Jul 23, 2025
    54
    run
    xomix
    xomix
    Jul 24, 2025
    55
    不知道 Linux 下如何处理,微软系的处理方式一直是没有完成复制之前是不会修改原始位置的文件的(也就是移动文件没完成复制动作不会删除)。
    Linux 下我没见过类似的文件,你需要自己去找资料了。
    clasd2011
    clasd2011
    OP
    Jul 28, 2025
    56
    目前什么都没有发生,也许未来机器重启了,就知道最终结果了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1707 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 23:42 · PVG 07:42 · LAX 15:42 · JFK 18:42
    ♥ Do have faith in what you're doing.