V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
mikewang
V2EX  ›  Linux

rm -rf * 前一定一定要看清当前目录

  •  
  •   mikewang ·
    MikeWang000000 · 2023-09-23 23:10:52 +08:00 · 7171 次点击
    这是一个创建于 430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    惨!数据差点归零。


    起因是这样的:

    想要写一个 Dockerfile ,先建个容器敲一下:

    docker run --rm -v /mnt/sda1:/mnt/sda1 -it alpine
    

    为了方便,把数据盘也挂上去了。

    然后做了一些复制解压:

    cp /mnt/sda1/somefile.tar.gz .
    tar xzvf somefile.tar.gz
    cd somefile-v1.0
    ls
    

    看了看内容觉得不是自己想要的,回上一级目录准备删掉:

    cd ..
    rm -rf *
    

    我想当然地认为自己在 /root 下面,这里原本应该什么都没有。然而一回车:

    rm: can't remove 'dev/console': Resource busy
    rm: can't remove 'dev/urandom': Resource busy
    rm: can't remove 'dev/random': Resource busy
    rm: can't remove 'dev/tty': Resource busy
    rm: can't remove 'dev/full': Resource busy
    ...^C^C^C^C^C^C^C^C^C^C^C
    

    。。。是在 / 啊!!!然后 /mnt/sda1 的东西自然也是被删了一堆,吓坏我了。


    好在是 ZFS ,心惊胆战地回滚到了一天前的快照,暂时没有发现特别大的损失。这才松了一口气。

    吓死了,下次删文件前一定要注意当前目录啊。。。

    第 1 条附言  ·  2023-09-24 01:31:32 +08:00
    补充说明一下,上面的操作都是在 Docker 容器内进行的。我也是因为在容器内觉得没多大事,所以操作过于随意了。
    一般来说 Docker 容器内就算全删了也没事,最多就是重建个容器。这里问题在于我映射了宿主路径,再加上误操作,导致宿主数据丢失。
    48 条回复    2023-10-01 03:42:08 +08:00
    Nugine0
        1
    Nugine0  
       2023-09-23 23:16:51 +08:00   ❤️ 5
    笑死,上一个还热乎呢,这又来一个 https://v2ex.com/t/976473
    BeautifulSoap
        2
    BeautifulSoap  
       2023-09-23 23:19:18 +08:00 via Android
    问题的次要原因还在 alpine 默认只有 sh ,而 sh 不像 bash ,zsh 那样显示目前在哪个目录。
    在 alpine 里操作的时候经常就出现不用 pwd 搞不清自己在哪个目录的情况。
    BeautifulSoap
        3
    BeautifulSoap  
       2023-09-23 23:25:05 +08:00 via Android
    试了一下,干,怎么 alphine 下的 sh 又显示当前目录了。难道记差了
    mikewang
        4
    mikewang  
    OP
       2023-09-23 23:45:35 +08:00
    @BeautifulSoap #3 alpine 现在默认 shell 是 /bin/ash ,其实是显示当前目录的。不过 docker 默认进去的目录就是 /,提示就是:/ #,比较不显眼
    chenliangngng
        5
    chenliangngng  
       2023-09-23 23:57:38 +08:00
    别用*,我要删也是自己选目录删的
    vvhy
        6
    vvhy  
       2023-09-24 00:13:55 +08:00
    我装了个 safe-rm
    wipbssl
        7
    wipbssl  
       2023-09-24 00:28:21 +08:00
    加入参数 f 时都写绝对路径吧
    wipbssl
        8
    wipbssl  
       2023-09-24 00:30:27 +08:00
    为什么你们都喜欢加-f 呢?
    yeqizhang
        9
    yeqizhang  
       2023-09-24 00:47:50 +08:00 via Android
    我觉得你挂载的目录太大了,然后其实和你描述 docker 这块也没啥关系吧,你解压不是在宿主机解压再删除的么,除了看清目录,建议不要用*,除非是*xxx 这样
    xiaoranj
        10
    xiaoranj  
       2023-09-24 01:01:00 +08:00
    我还以为在说鼎桥成都公安的事呢
    mikewang
        11
    mikewang  
    OP
       2023-09-24 01:24:22 +08:00
    @yeqizhang #9 不是的,解压、删除都是在 docker 临时容器内进行的,为了写 Dockerfile 前测试下。
    一般来说 docker 内就算全删了也没事,最多就是重建个容器,问题在于我映射了宿主路径。
    jqtmviyu
        12
    jqtmviyu  
       2023-09-24 02:49:37 +08:00
    吓得我 `alias rm='rm -i'`
    ysc3839
        13
    ysc3839  
       2023-09-24 03:53:36 +08:00 via Android
    @BeautifulSoap bash 默认也不会显示目录吧?都是发行版的 profile 给配置了个会显示目录的 PS1 所以才显示的
    passive
        14
    passive  
       2023-09-24 04:21:36 +08:00 via Android   ❤️ 10
    有一次

    rm -r $foo/*

    结果 $foo 拼错了或者没定义。
    幸好平时的习惯把数据拯救了:

    我会在各个根目录上

    : > ! ; chmod 000 !

    rm 的时候首先删到这个 ! 文件,没有权限会出错,不会继续删下去了。
    loading
        15
    loading  
       2023-09-24 07:09:26 +08:00 via iPhone
    alias rm=trash
    winstars
        16
    winstars  
       2023-09-24 08:21:59 +08:00 via Android
    改成./*会死吗,这么偷懒
    melkor
        17
    melkor  
       2023-09-24 09:00:59 +08:00 via iPhone   ❤️ 1
    @winstars 在/目录结果也没啥区别……
    mobmoob
        18
    mobmoob  
       2023-09-24 09:10:09 +08:00
    别用*就好
    vcn8yjOogEL
        19
    vcn8yjOogEL  
       2023-09-24 10:52:26 +08:00
    rm 前先 ls
    julyclyde
        20
    julyclyde  
       2023-09-24 11:37:28 +08:00
    @BeautifulSoap shell 是否显示当前目录不是由 PS1 管理吗?
    那个 sh 是不支持 PS1 ?
    mikewang
        21
    mikewang  
    OP
       2023-09-24 13:03:05 +08:00
    @jqtmviyu @loading #12 #15 alias 不错,不过像我这样在 docker 内调试的还是看一下,全新的环境里没有 alias 。
    这次文件系统定时快照救了我,这个大概是最后一道防线。

    @winstars #16 ./* 在根目录也会一样删光。这次事故给我的经验是,还是检查下路径为好。

    ----

    总之,十年 Linux 老用户栽在这上面非常滴惭愧,各种命令因为熟练已经开始闭眼打了,系统也很忠诚地执行了我 “清空当前目录” 的指令。命令没输错,执行很精准,只是当前目录( docker 进入的默认目录)是个根。[裂开]
    rekulas
        22
    rekulas  
       2023-09-24 13:30:06 +08:00   ❤️ 4
    @jqtmviyu 吓得我马上又给你改成 alias cd="rm -rf"
    alias alias="reboot"
    realpg
        23
    realpg  
       2023-09-24 13:38:00 +08:00
    什么野鸡教出来的运维……
    rm -rf 相对的基本都被开除了
    realpg
        24
    realpg  
       2023-09-24 13:38:28 +08:00
    @winstars #16
    这也没区别
    正确的做法是到上级目录删除整个目录本身 指定名称 需要重建再重建
    BaiLinfeng
        25
    BaiLinfeng  
       2023-09-24 13:48:24 +08:00
    上几周我就是 rm -rf ./*直接把系统干废了,就是没看清目录,直接在根目录执行了,还好是我自己本地的环境。想修复可惜连 ssh 都无法进入了,只要重新安装系统了
    diagnostics
        26
    diagnostics  
       2023-09-24 14:28:48 +08:00
    看起来 ubuntu 一定让你用 ubuntu 这个用户登陆是有道理的。
    rev1si0n
        27
    rev1si0n  
       2023-09-24 14:30:46 +08:00
    我就吃过亏,然后用了 safe-rm ,用了还不放心,定时任务定时从 bash history 中删除所有 rm 命令😂
    hsfzxjy
        28
    hsfzxjy  
       2023-09-24 14:31:36 +08:00 via Android   ❤️ 1
    看到首页有两个这个帖子我就绷不住了
    ob
        29
    ob  
       2023-09-24 14:49:25 +08:00
    @passive 试验了一下,好像还是可以删除
    [root@VM-8-10-centos a]# : > ! ; chmod 000 ! ;
    [root@VM-8-10-centos a]# ll
    total 0
    ---------- 1 0 0 0 Sep 24 06:48 !
    [root@VM-8-10-centos a]# rm -rf !
    [root@VM-8-10-centos a]# ll
    total 0
    godymoon
        30
    godymoon  
       2023-09-24 15:35:14 +08:00
    @Nugine0 一进来就看到连续两个 rm -rf 的,笑死了
    fdd92
        31
    fdd92  
       2023-09-24 17:06:00 +08:00
    删除文件夹最好别用相对路径呀。。
    passive
        32
    passive  
       2023-09-24 18:15:08 +08:00 via Android
    @ob 别带 -f

    正常操作一般用不到 -f
    mauis
        33
    mauis  
       2023-09-24 18:38:33 +08:00
    非要用 rm 用绝对路径好了。别相对
    dimpleok
        34
    dimpleok  
       2023-09-24 18:46:27 +08:00
    可以参考,https://zhuanlan.zhihu.com/p/658109345 (利用技术手段避免误删除根目录).
    jellyspot
        35
    jellyspot  
       2023-09-24 21:05:28 +08:00
    我用 rm 命令要求都是必须跟完整路径,不要怕麻烦,麻烦点安全
    James369
        36
    James369  
       2023-09-24 22:28:07 +08:00
    我一般删除前先 mv /tmp/, 完了过几天再删除
    bobryjosin
        37
    bobryjosin  
       2023-09-24 22:39:40 +08:00
    我的习惯一般要删也是完整路径,删完指定目录再 mkdir 一个,麻烦是麻烦了点但是确实安全,尤其是* -f ,就算要用一定要再看一眼,要明白自己在干什么。
    lovelylain
        38
    lovelylain  
       2023-09-24 22:50:04 +08:00 via Android
    之前给移动硬盘格式化 btrfs ,把娃的照片从手机剪切到上面,后来强迫症喜欢删除空目录,一个不小心把移动硬盘根目录删了,花了一天一夜尝试恢复,只恢复出一些不重要的文件,后来养成了定期快照的习惯。
    Love4Taylor
        39
    Love4Taylor  
       2023-09-24 22:52:16 +08:00 via iPhone
    所以要养成有事没事 ls 的习惯
    Inzufu
        40
    Inzufu  
       2023-09-24 22:55:33 +08:00 via Android   ❤️ 1
    看到标题就已经想笑了)
    guanzhangzhang
        41
    guanzhangzhang  
       2023-09-24 23:19:38 +08:00
    非 bash 那种小 sh 的,WORKDIR 缺省都是 /
    iseki
        42
    iseki  
       2023-09-24 23:32:13 +08:00
    我现在 rm 这种命令所有出现 * 的都得使劲确认才敢按🤣比 / 危险多了
    iwwftlan
        43
    iwwftlan  
       2023-09-25 00:20:45 +08:00
    最近经常看到 rm 的瓜, 前几天刚看了一个成都某公司员工把公安系统删库了。。。
    pocarisweat
        44
    pocarisweat  
       2023-09-25 00:33:57 +08:00   ❤️ 1
    做破坏性操作参数带*的时候,我会按 tab 把*给展开再确认一遍
    mikewang
        45
    mikewang  
    OP
       2023-09-25 00:36:50 +08:00
    #44 @pocarisweat 这个是 zsh 的特性吧,比 bash 强
    89ao
        46
    89ao  
       2023-09-25 13:12:26 +08:00
    rm -rf 不加绝对路径的真的是看多了。
    再不济 mv 到/tmp 都不麻烦,要养成习惯啊别等人说
    GoldenSheep
        47
    GoldenSheep  
       2023-09-25 18:42:48 +08:00
    哈哈哈 上星期我刚 cd /etc; rm -rf ./* 就少打了一个点
    hGaHLRyC
        48
    hGaHLRyC  
       2023-10-01 03:42:08 +08:00
    养成 mv 到 tmp 才是好习惯。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:15 · PVG 19:15 · LAX 03:15 · JFK 06:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.