rm -rf * 前一定一定要看清当前目录 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
mikewang
V2EX    Linux

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

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

    惨!数据差点归零。


    起因是这样的:

    想要写一个 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 是否显示当前目录不是由 P1 管理吗?
    那个 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  
    PRO
       2023-09-24 13:38:00 +08:00
    什么野鸡教出来的运维……
    rm -rf 相对的基本都被开除了
    realpg
        24
    realpg  
    PRO
       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  
    PRO
       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     Solana     2774 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 13:16 PVG 21:16 LAX 05:16 JFK 08:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86