【问题标题】:What is the safest way to empty a directory in *nix?在 *nix 中清空目录最安全的方法是什么?
【发布时间】:2008-12-16 23:30:31
【问题描述】:

我害怕有一天,我会在我目前使用的命令中添加一个空格或遗漏一些东西:

rm -rf ./*

有没有更安全的方法来清空当前目录的内容?

【问题讨论】:

  • 好的 Unix 发行版并不能保护您免受自己的伤害,而优质的黑客更喜欢这样。
  • 我希望这样的评论可以被否决。防止错误是好的,只要它不会造成愚蠢的开销破坏您的生产力。例如我总是使用 root,因为我讨厌在我输入的每个命令之前都必须加上“愚蠢的 sudo”……但是,OTOH,我将我的 mv 和 rm 别名为默认情况下总是有确认。好的 unix 发行版只是让您按照自己喜欢的方式做事。对愚蠢的拼写错误的基本保护非常好,只要它不是静默的,并且当您错误地要求清空 / 目录时会产生清晰的错误消息。
  • 而回答问题,我个人习惯先输入“rm ”,然后再读一遍,仔细检查,最后加上“-rf” “在行尾。它可能看起来很愚蠢,或者非常缓慢,但我每天不会使用它几十次,而且无论在什么条件下,我总是害怕在打字时不小心按回车。这也是我之前不打-r参数的主要原因。

标签: linux unix command-line


【解决方案1】:

这里有一个更安全的方法:首先使用ls列出将受到影响的文件,然后使用命令行历史记录或历史替换将ls更改为rm,然后再次执行命令确信将对正确的文件进行操作。

【讨论】:

    【解决方案2】:

    如果您想真正安全,可以创建一个简单的别名或 shell 脚本,例如:

    mv $1 ~/.recycle/

    这只会将你的东西移动到 .recycle 文件夹(你好,Windows!)。

    然后设置一个 cron 作业来对该文件夹中超过一周的内容执行 rm -rf。

    【讨论】:

      【解决方案3】:

      我认为这是一个合理的方式:

      find . -maxdepth 1 \! -name . -print0 | xargs -0 rm -rf
      

      它还会处理隐藏的文件和目录。点后不需要斜杠,这也将消除键入. / 的可能意外。

      现在如果你担心它会删除什么,只需将其更改为

      find . -maxdepth 1 \! -name . -print  | less
      

      然后查看列表。现在你可以把它放到一个函数中:

      function enum_files { find . -maxdepth 1 \! -name . "$@"; }
      

      现在你的删除是安全的:

      enum_files | less                     # view the files
      enum_files -print0 | xargs -0 rm -rf  # remove the files
      

      如果您不习惯在文件名中嵌入换行符,则可以省略 -print0-0 参数。但我会使用它们,以防万一:)

      【讨论】:

      • 你不需要管道:find -mindepth 1 -print -delete(删除 -delete 进行测试并注意我已将 maxdepth 更改为 mindepth 以摆脱点名反转参数.)
      【解决方案4】:

      最安全的方法是在按 Enter 之前坐在你的手上。

      除此之外,您可以创建一个像这样的别名(用于 Bash)

      别名 rm="pwd;read;rm"

      这将显示您的目录,等待输入,然后删除您使用正确标志指定的内容。您可以通过按 ^C 而不是 Enter 来取消。

      【讨论】:

      • 那太恶心了;它鼓励您假设您将获得第二次使用 rm 命令的机会。等到您移动到另一台机器或以另一个用户身份登录,然后 bam...
      • 最好按照 alias alias delete="..." 的方式做一些事情
      • 是的,使用不同的名称可能是一个更好的主意。但是,没有什么可以取代适当的照顾(您可能已经习惯按两次 Enter 键,以至于在您最需要的时候它对您没有好处)
      【解决方案5】:

      上一级并输入目录名称

      rm -rf <dir>/*
      

      【讨论】:

      • 如果你已经在 / 并且执行 cd .. rm -rf /* 你将被拥有。 ;)
      • 始终使用您要删除的目录名称!永远不要以 root 身份工作。
      【解决方案6】:

      我使用以下之一:

      rm -fr .
      
      cd ..; rm -fr name-of-subdirectory
      

      我很少完全依附于一个目录,我想删除其中的内容,但必须保留目录本身。

      【讨论】:

      • 我什至会使用“cd .. && rm -fr name-of-subdir” 如果出于某种疯狂的原因“cd ..”应该失败,你可能会删除错误目录(如果它在两个级别都存在) - 非常偏执,不是吗;-)
      • @Christian K:我通常会使用两个单独的交互式命令,而不是用分号实际分隔它们。您的修订更安全。有时 'cd ..' 可能会失败;一种是有人已经删除了目录;另一种是当您没有权限时(不再)。
      • @Christian K:如果你的 shell 支持它,那么 'cd .. && rm -fr $OLDPWD' 是相当安全的。如果您不小心在波浪号和破折号之间放置了一个空格,使用 'rm -fr ~-' 会产生可怕的后果,因此不太安全。
      【解决方案7】:

      在使用 rm -rf 时,我几乎总是使用完全限定路径。

      【讨论】:

        【解决方案8】:

        使用trash 命令。在 Debian/Ubuntu/etc. 中,可以从包 trash-cli 安装它。它适用于文件和目录(因为它实际上是在移动文件,而不是立即删除它)。

        trash 实现了freedesktop.org trash specification,与 GNOME 和 KDE 垃圾箱兼容。

        可以使用 restore-trash 从同一包中或通过通常的 GUI 取消删除文件。

        【讨论】:

        • 对我来说似乎是最好的答案。有什么缺点吗?我唯一想知道的是“它保留文件多长时间?”,因为当然,这可能会在您实际...尝试删除文件时产生磁盘问题,最终被“隔离”
        【解决方案9】:

        您可以随时打开-i,它会在每个文件上提示您,但对于大型目录来说,这将非常耗时。

        我总是先做一个pwd

        我什至会创建一个别名,以便为我的用户强制提示。我认为 Red Hat 默认会这样做。

        【讨论】:

          【解决方案10】:

          您可以删除“f”开关,它会提示您输入每个文件,以确保您确实要删除它。

          【讨论】:

            【解决方案11】:

            如果您想做的是炸毁整个目录,那么该操作总是存在一定程度的危险。如果你真的想确保你做的事情是正确的,你总是可以做一个移动操作到某个地方,比如 /tmp,等待一段时间,以确保在“删除”到位的情况下一切正常。然后进入 /tmp 目录并仅使用相对路径进行强制和递归删除操作。另外,在移动中重命名为“delete-directoryname”,以便更容易不出错。

            例如我想删除 /opt/folder 所以我这样做:

            mv /opt/folder /tmp/delete-folder

            ....等到确定一切正常 - 也许一分钟,也许一周....

            cd /tmp

            密码

            rm -rf 删除文件夹/

            执行 rm -rf 最重要的提示是始终使用相对路径。这可以防止您在完成输入之前输入 /。

            【讨论】:

              【解决方案12】:

              我有 [tcsh] 是有原因的:

              alias clean  '\rm -i -- "#"* *~'
              alias rmo    'rm -- *.o'
              

              它们是我第一次不小心在 * 和 .o 之间添加空格时创建的。我只想说,发生的事情不是我预期的……

              但情况可能会更糟。早在 90 年代初期,我的一个朋友就有一个 ~/etc 目录。他想删除它。不幸的是,他输入了 rm -rf /etc。不幸的是,他以 root 身份登录。他今天过得很糟糕!


              作恶:touch -- '-rf *'

              为安全起见,请使用 '--'-i。或者做对一次,然后创建一个别名!

              【讨论】:

                【解决方案13】:

                这是我在 macOS 上使用的别名。它会在执行之前询问每个 rm 命令。

                # ~/.profile
                
                function saferm() {
                    echo rm "$@" 
                    echo "" 
                    read -p "* execute rm (y/n)? :  " yesorno
                
                    if [ $yesorno == "y" ]; then
                         /bin/rm "$@"
                    fi
                }
                
                alias srm=saferm
                alias rm=srm
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-29
                  • 2020-01-17
                  • 2018-06-23
                  • 2013-12-01
                  • 2011-05-16
                  • 2014-11-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多