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

除了 rm 之外就没有其他更安全的删除文件的方法吗?比如遇到删除系统核心的目录直接报错,或者提示没有权限,或者给强提醒,或者给个后悔药啥的。

  •  
  •   helphelp · 2023-09-24 14:19:30 +08:00 · 5910 次点击
    这是一个创建于 450 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最起码不像 rm -rf 一样,删除/的话 什么提示都没有

    看了这两天的热帖,有两个都是因为 rm -rf 误删的,我自己之前说实话也执行过,想问一下有好的方法吗?

    73 条回复    2023-09-28 15:19:05 +08:00
    em70
        1
    em70  
       2023-09-24 14:22:29 +08:00   ❤️ 22
    自己加的 f,还怪人不提示
    Vegetable
        2
    Vegetable  
       2023-09-24 14:38:16 +08:00   ❤️ 1
    你是否在找 sudo
    e9pWeUbh9PGCnp95
        3
    e9pWeUbh9PGCnp95  
       2023-09-24 14:43:07 +08:00
    直接改 rm 的源码, 把-f 这个参数给 nop 掉 <doge>
    realpg
        4
    realpg  
       2023-09-24 14:45:52 +08:00   ❤️ 1
    对于一个合格的运维,rm 就不可能误删
    查 history
    习惯不好的都开了

    企业内规范定好,

    比如你想删除/home/a 下面的所有文件
    那么你应该要么切到 a 上级
    rm -rf a/*
    要么
    rm -rf a
    然后重新创建 a

    进入 a 目录再 rm -rf * 的 写岗位手册里全开除就完事

    这就是我公司我定的规则
    akira
        5
    akira  
       2023-09-24 14:47:58 +08:00   ❤️ 1
    最好的办法就是不要登服务器。 其它方法都是治标不治本的
    timochan
        6
    timochan  
       2023-09-24 14:58:32 +08:00   ❤️ 1
    不要盲目使用 ROOT 权限不就行了,需要的时候再 sudo
    ivvei
        7
    ivvei  
       2023-09-24 15:01:10 +08:00 via Android
    @realpg a 后面手抖多敲一个空格你怎么破?
    realpg
        8
    realpg  
       2023-09-24 15:09:23 +08:00
    @ivvei #7

    首先,习惯不好就是运维最大的问题。该多按 tab 的地方不按就是这结果

    手抖的造成重大事故是个人责任,劳动法琢磨好,离职补偿就省下啦
    nuk
        9
    nuk  
       2023-09-24 15:14:16 +08:00
    在每次更改之前 snapshot ,直接给你回溯的机会
    cyningxu
        10
    cyningxu  
       2023-09-24 15:22:42 +08:00
    这话问得,f 不是运行命令的人加的么
    Jirajine
        11
    Jirajine  
       2023-09-24 15:28:29 +08:00 via Android
    @realpg #4 非常糟糕的规则,这样做麻烦不说,如果目录 a 有特殊的权限或其他 attribute 都会无法保留。
    rm -rf * 要么执行前按 tab 通过 glob expansion 把*替换成实际要删除的文件名,要么 alias rm='rm -I' 或者其他 trash cli 提供二次确认。
    不过这些都不能解决之前那个帖子容器环境下默认 shell 补全和配置都很受限的情况。
    ydpro
        12
    ydpro  
       2023-09-24 15:30:14 +08:00
    记得之前 github 上有一个项目就是可以回滚输入的命令,但是忘记叫什么了。
    iblessyou
        13
    iblessyou  
       2023-09-24 15:48:42 +08:00 via Android
    @em70 应该主要还是想找个 windows 回收站类似的。
    realpg
        14
    realpg  
       2023-09-24 15:49:45 +08:00
    @Jirajine #11
    没说完而已 后面有说了完整的

    特殊权限的
    绝对目录或者切到上级
    rm -rf a/*
    不允许直接本机-f
    someonedeng
        15
    someonedeng  
       2023-09-24 15:55:47 +08:00   ❤️ 3
    rm 改成移动到某个目录,然后定期清理
    joyhub2140
        16
    joyhub2140  
       2023-09-24 16:26:39 +08:00   ❤️ 1
    都不如打快照来得安心。
    tairan2006
        17
    tairan2006  
       2023-09-24 16:28:33 +08:00 via Android
    trash
    matchalatte
        18
    matchalatte  
       2023-09-24 17:36:53 +08:00   ❤️ 1
    alias rm=trash-put
    trash-cli 类似于桌面环境的回收站,删除只是移到另一个路径,可以用 trash-empty 30 清理 30 天前的垃圾文件。
    https://github.com/andreafrancia/trash-cli
    Jirajine
        19
    Jirajine  
       2023-09-24 18:08:46 +08:00 via Android
    @realpg #14 如果 a 是一个含有空格的目录名,仍然可能会导致误删除。而且切了工作目录忘切回去怎么办?要不规范再加一条切到上级不许用 cd ,必须用 pushd 和 popd 。

    其实如果 rm 是 GNU coreutils 提供的,直接要求使用或 alias 一个 -I 就可以了,该选项会在删除多个文件是提醒用户确认一次。
    realpg
        20
    realpg  
       2023-09-24 18:23:20 +08:00
    @Jirajine #19
    公司环境不存在有空格的目录名 而且手册建议 tab 确认会自动加上引号

    你总是试图用那些特例来质疑已经稳定运行很久的规则 而我不可能把公司运维岗位规范手册那么厚的一本都贴 V2 论坛上

    感觉,您真的,就好像互联网上的那种运动器材成精生物……
    realpg
        21
    realpg  
       2023-09-24 18:26:45 +08:00
    @Jirajine #19

    管理的艺术就是行政命令和技术结合,该行政命令时候就不要技术解决,该技术解决的不依赖行政命令

    而且,我已经从数据中心公司离职了 至少我治下的公司从来没出过任何这类事故,哪怕没有重大影响

    因为运维的 shell 的操作都是通过堡垒系统,所有指令甚至所有键盘按键都是记录的,隐形风险操作随便数据库写个查询就能列出来,一次不长脑子未造成恶劣影响可以学习,可以巨额罚款填坑大家聚餐,多次不长脑子的运维都没任何补偿的滚蛋了
    iseki
        22
    iseki  
       2023-09-24 18:54:49 +08:00 via Android
    @realpg 很危险啊,/* 这种东西尽量不要出现,rm -rf / 都能保护住,谁手滑敲成 rm -rf sth /* 一点机会都不会有
    iseki
        23
    iseki  
       2023-09-24 18:57:50 +08:00 via Android
    没什么太好办法,不用 -f 也就那么回事,时间长了人一旦皮条了一点辙都没有。坚持双人检查可能更有意义
    realpg
        24
    realpg  
       2023-09-24 19:00:44 +08:00   ❤️ 1
    @iseki #22
    没接受过金钱的毒打的运维自然会打出/ *
    iseki
        25
    iseki  
       2023-09-24 19:05:05 +08:00
    @realpg 我觉得这个还好,除非你当前在 / 下面,否则 rm -rf / 只会提示 preserved ,*也就删删当前目录,我提这个主要规避删根的···
    Jirajine
        26
    Jirajine  
       2023-09-24 19:05:35 +08:00 via Android
    @realpg
    因为你这种规范要求就和这个帖子 https://www.v2ex.com/t/816040 不准用 http put 一样没什么实际意义纯粹给人制造麻烦,GNU rm 已经内置了-i 和-I 的保护措施不用。顺便-f 根本是不必要的,很多人习惯 rm -rf 的原因是有些系统会默认 alias rm='rm -i',会导致批量删除时不加-f 会让每个文件都提示从而无法正常使用。
    MrKrabs
        27
    MrKrabs  
       2023-09-24 19:20:56 +08:00   ❤️ 2
    执行 rm 前要手机验证码
    dimpleok
        28
    dimpleok  
       2023-09-24 19:23:22 +08:00
    可以试试这里提到的方法,https://zhuanlan.zhihu.com/p/658109345 (利用技术手段避免误删除根目录)
    ZRS
        29
    ZRS  
       2023-09-24 19:26:11 +08:00 via iPhone
    做运维工具,不要手操,手操禁止高危命令
    bt7vip
        30
    bt7vip  
       2023-09-24 19:35:18 +08:00 via Android
    生产环境把 rm 设置成高危命令,删文件统一将文件 MV 到/tmp 目录,删除非/tmp 下文件直接报错。
    realpg
        31
    realpg  
       2023-09-24 20:03:12 +08:00   ❤️ 1
    @Jirajine #26
    良好的习惯比什么都重要

    要不干啥那么多误删库的

    下属员工习惯怎么培养的问题,我觉得我比你这种纯敲键盘没带过大运维的有经验


    @iseki #25
    说实话 我们实际生产中 大部分都是用且上级指名删整目录然后重建目录的办法

    很少有之前谁提到的什么目录带特殊权限什么的骚操作

    因为罚的太狠,随便查查操作历史就知道,干活的都很小心,各种反复确认

    2017 年时候疫情前业绩好,在沈阳这种三线城市,基本运维(有夜班,除非极特殊情况比如大割接,不加班)年底能拿 6 月薪的奖金,入职后三个月内一次险性可以不处罚,其他时候一次半月奖金填大坑聚餐,两次险性行为全年绩效奖就全没有,月薪普遍 8K 的话,你瞎鸡儿搞哪怕没严重后果,搞两次半年工资就打水漂了

    而且我之前提过,大部分场景,都是假终端,shell 操作的都是在特殊堡垒平台软件上,有二次包装,按键都是全记录分析的,这种场景是有能力拦截不正确高危操作的。

    培养习惯更重要,因为总有时候需要本地操作很多敏感数据,当时我们的业务,有些数据你操作错一次是要蹲监狱的。
    someday3
        32
    someday3  
       2023-09-24 20:33:07 +08:00
    就算有 windows 类似的回收站,你信不信,还是会有大量的人误删除,把回收站清空后发现又误删除。

    无他,人的问题单纯的技术是解决不了的。

    腾讯的云备份那么多流程,结果操作员精准避开所有规定的流程,导致数据丢失。在 nb 的流程、规范和技术都阻挡不住犯蠢的人。

    操作删除和其他危险命令的时候自己警觉一点,看一下有没有敲错,目录对不对,有没有超权限,比什么技术都 nb 。
    ochatokori
        33
    ochatokori  
       2023-09-24 20:59:58 +08:00 via Android
    我只会在外层用 tab 把路径补全出来,不会手写更不会进去用*
    Jirajine
        34
    Jirajine  
       2023-09-24 21:37:19 +08:00 via Android   ❤️ 1
    @realpg #31 你不如干脆说只要记录审计加重罚让人小心操作就解决了。
    你提供的推荐方式是错误的,只要目录的权限和当前 umask 不同、或所有用户/组与当前登录用户不同,从上级删除并重建就一定会把权限搞乱套。更不用说 xattr 等扩展属性、或者删掉了一个 btrfs subvolume 然后重建了一个普通的目录这种会为以后埋坑的现象。除非你的服务器是单用户的不然这种情况绝对不是“很少”而是很常见。
    不要把你在特定场景的施行那一套“运维体操”当作一般建议。
    iseki
        35
    iseki  
       2023-09-24 21:42:41 +08:00 via Android
    @realpg 嗯,我一般也是指明删整目录,打星号太危险了,每次涉及到通配符我都得停下来再三确认…
    我们这倒是不罚款,但是总搞出事故也不是什么好事啊…我到现在还没有一次把人家线上目录删坏过。
    不过你这样罚款它违反不违反劳动法
    realpg
        36
    realpg  
       2023-09-24 22:11:49 +08:00   ❤️ 2
    @iseki #35

    罚款不是目的,目的是养成习惯。习惯就是让你习惯公司规定写死的规则,你可以不理解,你可以嫌麻烦,你可以嫌这个很傻逼;这些弱智的规定都是有原因的,都是为了让傻瓜也能少犯错误。盲目自信才是出现各种奇葩问题的本质原因,在这里就是给你打掉自己自作聪明的机会,不遵守规则,就让你肉疼到死。

    搞技术的,天生排斥管理,也不想深入学习管理,不站在管理的思维上考虑问题,这也是 35 岁危机的一个重大原因,上升空间自己给自己堵死了。

    删除这个,基本日常每周培训的重点强调就是去上级删整个目录再重建。要么还有一个在 web 控制台的文件传输系统删除的办法。

    开除以前的罚款大部分都是直接填坑进公司基金,也不上交公司,聚餐团建用,差额公司掏。只有没有绩效奖金这种是公司赚了。

    小地方,这边招的素质参差不齐,虽然日常操作都是在高层假控制台上,总有特殊情况需要你本地操作的时候,以及协同客户操作客户的机器。日常习惯就是一点点积累的。

    我们这边日常各种强调的就是多用 tab 补全,多按不犯错。vi 调配置里多按 esc 切模式等一系列基本建议,就是防止某一次出坑。

    有些区域,业务比较敏感,真的是误操作会蹲监狱的。



    至于劳动法,严格遵守。因为大老板是体制内高层领导出身,当地有头有脸,一切有法可依的地方合规做的特别好,本市在商界是不著名小企业,但是在当地政府那边是有一号的。

    运维普通员工合同工资都是 5K 多,不出重大生产安全事故到手都 8K 多,严格遵守劳动法,在职过一年社保公积金技术都按上一年实发调整到 8K 左右。扣的只有合同没有一点承诺的 12 薪+过节费以外的个人绩效奖金。这部分在入职时候也是不说的,除非你是内推别人告诉你这公司有这待遇,否则都是你呆满 1 年你才知道有这比意外之财,4 月 1 日以后入职当年没有。

    而且,这个是要连坐的,三次险性事故征候,或一次造成损失实际事故,根据损失评估,有明确标准,是团队,还是所在班次(倒班班次)、运维分公司,乃至全公司这个钱都没有。
    aelloncs
        37
    aelloncs  
       2023-09-24 22:15:08 +08:00
    那不是自己业务不熟练能力不行还怪到工具上了?这种水平的还敢有管理员权限?啥公司啊?
    ulosggs
        38
    ulosggs  
       2023-09-24 22:26:25 +08:00
    这个 realpg 一直强调自己的管理多么牛,怎么这么牛的管理者招过来的小弟全是菜鸡呢
    inhzus
        39
    inhzus  
       2023-09-24 22:43:30 +08:00 via iPad
    alias rm mv
    dabai0806
        40
    dabai0806  
       2023-09-24 23:07:32 +08:00   ❤️ 1
    https://github.com/andreafrancia/trash-cli

    brew info trash-cli
    pip install trash-cli

    alias rm='trash-put'
    alias rl='trash-list'
    alias rr='trash-restore'
    pengtdyd
        41
    pengtdyd  
       2023-09-25 00:02:10 +08:00
    能问出这个问题,本身就是一个问题。
    lbm008
        42
    lbm008  
       2023-09-25 00:15:10 +08:00
    lindas
        43
    lindas  
       2023-09-25 00:37:06 +08:00
    我习惯先 ls 一下想删除的东西,然后再把 ls 改成 rm
    james122333
        44
    james122333  
       2023-09-25 01:41:58 +08:00 via Android
    当然有 不过不讲
    james122333
        45
    james122333  
       2023-09-25 01:47:03 +08:00 via Android
    @realpg

    问题是这问题不是技术无解 人都不是机器 每次都是手动 要计算机都无用 整好了没错可犯自然比出事要好
    rio
        46
    rio  
       2023-09-25 02:11:20 +08:00   ❤️ 1
    主要还是操作系统发行版不给力,那么多靠谱的方案可以保护系统核心文件不受影响( macOS 下 `rm -rf` 就不会影响核心系统,Linux 原生的方案也有 btrfs snapshot 可以利用),但是没有人做 🤷
    Ocean810975
        47
    Ocean810975  
       2023-09-25 03:55:39 +08:00 via Android
    在 linux 下用 pwsh 确实不会出现这样的问题
    msg7086
        48
    msg7086  
       2023-09-25 06:55:58 +08:00   ❤️ 1
    要提示没有权限,可以用非特权用户。
    要给提醒,可以不加 f ,可以用 zsh 。
    要最佳实践,可以制定规则,可以写 checklist ,可以在执行危险操作之前双手离开键盘先思考 5 秒钟人生再按下回车。

    危险操作,每个行业都有。做手术的,开飞机开火车的,做化工的,造大楼的,甚至是马路上开车的。运维又不是什么特殊岗位。看看别的行业怎么避免手滑的,怎么规范操作的,照搬一下就行了。

    讲讲我自己的运维习惯。我所有的操作都是 root 账号下运行,因为我所有的操作都涉及到 root 权限,开非特权账号没有意义。首先是我用 zsh 并且把 IP ,主机名,当前目录放在提示符里,高亮分颜色显示,一眼就知道自己操作的是哪台机器,在哪个目录里操作。其次对于重要的生产机,我会在提示符里加上高亮闪烁的 PRODUCTION 字样,一眼就知道自己在操作危险环境。最后对于有副作用的操作,比如 rm ,比如升级软件包,比如重启机器等,按下回车之前脑子里先想一想自己在干什么,确认无误以后再按。

    人犯错是无解的,再多的措施无法避免。但是这些措施可以把一月一遇、一年一遇的错误操作,变成十年一遇,百年一遇。航空业那么多飞机天天飞,事故也是无法避免的,但是现在的措施可以做到概率足够小,远比坐车甚至走路安全,那就行了。
    rekord
        49
    rekord  
       2023-09-25 07:44:02 +08:00 via Android
    要不做个别名,将 rm 映射到 cp ,然后是不是就变成了回收站的效果。
    huajingyu
        50
    huajingyu  
       2023-09-25 07:44:31 +08:00 via Android
    我使用 Windows ,经常使用 CMD 。( CMD 比文件资源管理器快。)
    我很少使用 \ 和 . 目录,我删除文件和目录,会输入绝对路径,或是至少有一个文件名的相对路径。从来没有只删除 \ 或 . 的情况。
    比如说我要删除 Folder 这整个文件夹,如果当前目录在这个文件夹中,我会先 CD .. 到上层文件夹,然后再输入 RMDIR /S Folder 去删除。
    不过我很早以前,当前目录在用户文件夹的时候,不小心 DEL /S *.TXT 把用户文件夹下所有文本文件删了一部分,后来及时 ^C 给中断了。然后重装了一些软件。( AppData 是第一个被遍历的文件夹,所以一些配置文件被删除了。)
    gpt5
        51
    gpt5  
       2023-09-25 08:14:38 +08:00
    mv
    THESDZ
        52
    THESDZ  
       2023-09-25 09:03:50 +08:00
    safe-rm
    cslive
        53
    cslive  
       2023-09-25 09:05:48 +08:00
    上审计,高危命令需要授权确认
    dadebucuo
        54
    dadebucuo  
       2023-09-25 09:34:17 +08:00
    用 inode 精确删单个目录
    cd /xxx
    ll -i
    find /xxx -maxdepth 1 -inum $inodeNo | xargs rm -rf
    lisxour
        55
    lisxour  
       2023-09-25 09:39:07 +08:00
    把 rm 换掉不就好了,系统层面基本无解,你从命令行删除文件,即使系统有回收站,大概率也只是提供给 GUI 用的,windows 也是一样,你在 cmd 删文件是不会跑到回收站的,回收站仅限于资源管理器删除。

    1. 换成更安全的兼容替代品,比如 dry run 检测到正在删除根目录或者系统目录的东西,先提示一个大大的 warning
    2. 把 rm 换成有备份的替代,基本就是 rm 换成了 mv
    standchan
        56
    standchan  
       2023-09-25 09:39:44 +08:00
    别名、权限,linux 已经做的很多的,抵不上你糟糕的习惯!!!!
    2NUT
        57
    2NUT  
       2023-09-25 09:55:51 +08:00
    精细化权限控制 不要使用 root 权限
    blackkkk
        58
    blackkkk  
       2023-09-25 09:57:26 +08:00
    1 、不用-f
    2 、删前备份
    3 、禁/开头,要删哪些进入对应目录,总不至于你们把东西放在/目录下吧,规范上都不合理了。
    xFrye
        59
    xFrye  
       2023-09-25 10:50:03 +08:00
    有啊,删目录之前看看自己确认下要删什么东西不行么? sudo -rf 还不知道自己要删的哪个目录,只能找神仙来救救你了
    qiyilai
        60
    qiyilai  
       2023-09-25 10:51:01 +08:00
    终于知道奇怪的功能特性和需求的来源了
    llrasd
        61
    llrasd  
       2023-09-25 10:58:05 +08:00
    mv 到 /tmp 目录,过几天就自己自动删除了
    pota
        62
    pota  
       2023-09-25 11:02:24 +08:00
    后悔药就是不要 rm mv 就好
    suofeiya
        63
    suofeiya  
       2023-09-25 11:04:39 +08:00

    来个 trash-cli 的别名吧,我本地和服务器上都设置了.
    cy18
        64
    cy18  
       2023-09-25 11:11:50 +08:00
    犯错三步骤:
    1. 用 root 登陆或者无脑 sudo 。
    2. 删文件前不看当前目录或者手滑多打空格。
    3. rm -rf 。
    三个步骤都有规避方法:
    1. 不要使用 root ,加 sudo 前过脑子。
    2. 制定合适的操作规范,比如 @realpg #4
    3. 使用其他命令做 alias ,比如 @dabai0806 #40
    tomychen
        65
    tomychen  
       2023-09-25 11:28:00 +08:00
    mv 到 for_delete_path/
    然后让主管来 rm (路过.jpg
    zsh2517
        66
    zsh2517  
       2023-09-25 13:25:56 +08:00
    说一下我自己的情况
    1. 不 rm * 或者 ./XX (包括 ./*),为了避免键盘出问题。
    删除一个东西的时候,进到他的上一层,然后 rm 后面直接跟跟具体的文件名/目录名,而不是通配符(例外情况,*.jpg ,log-* 这种名称+通配符)

    2. rm 输入完之后,tab 确认一下(文件不存在/前缀匹配/完全匹配,shell 表现是不一样的)

    3. rm xxx; rm xxx -r; rm xxx -rf; ,默认情况 rm ,知道是目录的情况下才加 -r ,删除有问题的时候才加 -rf 。
    避免删除以为是个文件,结果是个目录的情况。以及后面输入参数的时候有机会再看一遍删除的东西对不对

    4. 重要的东西,mv xx xx.old / mv xx ~/.trash 先扔一边,确认没问题再删除
    zsh2517
        67
    zsh2517  
       2023-09-25 13:27:12 +08:00
    @lindas 你这让我想起来,SQL 删改之前先 select ,select 没问题再改 update/delete
    happyxhw101
        68
    happyxhw101  
       2023-09-25 13:30:47 +08:00
    用 mv 代替 rm
    Terry3366
        69
    Terry3366  
       2023-09-25 13:45:53 +08:00
    @realpg #4 为什么不能进目录再 * 我都是这么操作的
    我看那个误删的帖子是 删的 /
    julyclyde
        70
    julyclyde  
       2023-09-25 19:56:58 +08:00
    文责自负就挺安全的
    lindas
        71
    lindas  
       2023-09-25 20:10:38 +08:00
    @zsh2517 一个思路,不可逆操作前,不看清目标就不安心
    dode
        72
    dode  
       2023-09-26 09:26:54 +08:00
    搞上存储快照、数据库备份,CI/CD 部署,容器运行无状态服务
    ruifeng
        73
    ruifeng  
       2023-09-28 15:19:05 +08:00
    把 rm 改成 mv 到/tmp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5755 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:07 · PVG 14:07 · LAX 22:07 · JFK 01:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.