【问题标题】:In Unix, how do you remove everything in the current directory and below it?在 Unix 中,如何删除当前目录及其下的所有内容?
【发布时间】:2010-10-23 16:11:24
【问题描述】:

我知道这会删除子目录及其下方的所有内容:

rm -rf <subdir-name>

但是如何删除当前目录中的所有内容以及它下面的每个子目录以及所有这些子目录的内容?

【问题讨论】:

标签: bash unix directory subdirectory delete-directory


【解决方案1】:

使用

rm -rf *

更新:. 代表当前目录,但我们不能使用它。该命令似乎对... 进行了明确的检查。请改用通配符通配符。但这可能是有风险的。

使用更安全的 IMO 版本:

rm -ri * 

(这会在删除每个文件/目录之前提示您进行确认。)

【讨论】:

  • “可能有风险”非常简洁。
  • 在做这样的事情时,我找到了一个快速的 ls -r 。首先让您查看要删除的内容。有助于快速了解您不会删除整个磁盘...
  • 为什么它比 rm -rf 风险更大?
  • @Yen -- 因为如果你在错误的地方做这件事,你会得到灾难性的结果。在错误的地方使用特定的名称只会在恰好存在相同的子目录的情况下出错。
  • 你不能在子进程中删除父进程。
【解决方案2】:

确保确定您在正确的目录中

rm -rf *

【讨论】:

  • 这不会删除名称以句点开头的文件或子目录。
  • 真的。在我的测试中, rm -rf 也没有。 tvanfosson 用他的 "cd ..; rm -rf " 拥有最好的解决方案 IMO
【解决方案3】:
rm  -rf * 

别这样!这很危险!确保您在正确的目录中!

【讨论】:

    【解决方案4】:

    练习安全计算。只需在层次结构中上一层,不要使用通配符表达式:

    cd ..; rm -rf -- <dir-to-remove>
    

    两个破折号-- 告诉rm &lt;dir-to-remove&gt; 不是命令行选项,即使它以破折号开头也是如此。

    【讨论】:

    • 因为您专门匹配一个命名目录,因此不太可能删除您不打算删除的内容。
    • 是的。我可以很容易地看到自己做到这一点。
    • 它不也删除目录本身吗?之后您必须执行 mkdir 。但是之后任何引用该目录的硬链接都将是一个不同的目录。
    • @Yen,如果您使用rm ./,您可能会不小心输入rm . /,这可能是一场灾难。
    • hmm...我以为他想删除当前目录中的所有内容,而不是目录本身...我们该怎么做?
    【解决方案5】:

    将删除当前文件下的所有文件/目录。

    find -mindepth 1 -delete
    

    如果你想对另一个你有名字的目录做同样的事情,你可以直接命名

    find <name-of-directory> -mindepth 1 -delete
    

    如果您不仅要删除它的子目录和文件,还要删除目录本身,请省略-mindepth 1。在没有-delete 的情况下执行此操作以获取将要删除的内容的列表。

    【讨论】:

    • 我需要删除子目录下的所有文件,但不想自己删除子目录。 find -mindepth 2 -delete 效果很好!
    • 如果您要指定目录 (find &lt;name-of-directory&gt; -mindepth 1 -delete),则需要 -mindepth 1。否则 Johannes 是对的,它不会删除当前工作目录(使用 find -delete 时)。
    • IMO,这是最好的答案,尤其是在脚本中。
    • 我试过了:find -mindepth 1 -delete,但我得到了illegal option -- m,但是当我删除了 mindepth 选项时效果很好find . -delete
    【解决方案6】:

    rm –rf . 会直接删除当前目录中的所有内容,包括所有子目录及其内容,这是正确的。 单点 (.) 表示当前目录。注意不要使用rm -rf ..,因为双点 (..) 表示上一个目录。

    话虽如此,如果你和我一样同时打开多个终端窗口,你最好安全使用rm -ir . 让我们看看命令参数来了解原因。

    首先,如果您查看rm command man page(大多数Unix 下为man rm),您会注意到–r 的意思是“递归删除目录的内容”。因此,单独执行rm -r . 将删除当前目录中的所有内容及其下面的所有内容。

    rm –rf . 中添加的 -f 表示“忽略不存在的文件,从不提示”。该命令会删除当前目录中的所有文件和目录,并且永远不会提示您确认您确实想要这样做。如果您在特权用户下运行该命令,-f 特别危险,因为您可以删除任何目录的内容而没有机会确保这确实是您想要的。

    另一方面,在 rm -ri . 中,替换 -f-i 表示“在删除之前提示”。这意味着您将有机会在 rm 愉快地删除您的所有文件之前说“哎呀!那不是我想要的”。

    在我早期的系统管理员时代,我在以完全权限(root)登录时在系统上执行了rm -rf /。结果是两天后从备份中恢复系统。这就是我现在雇用rm -ri 的原因。

    【讨论】:

      【解决方案7】:

      这个最简单的安全通用的解决方案可能是:

      find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
      

      【讨论】:

        【解决方案8】:

        我总是打字

        rm -rf *
        

        然后然后按 ESC-*,bash 会将 * 扩展为当前工作目录中文件和目录的显式列表。

        好处是:

        • 我可以在按 ENTER 之前查看要删除的文件列表。
        • 命令历史不会包含完整的通配符“rm -rf *”,然后可能会在错误的时间在错误的地方意外重用。相反,命令历史记录将在其中包含实际的文件名。
        • 回答“等一下……我刚刚删除了哪些文件?”也变得很方便。文件名在终端回滚缓冲区或命令历史记录中可见。

        事实上,我非常喜欢这一点,因此我在 .bashrc 中使用这一行将其设为 TAB 的默认行为:

        bind TAB:insert-completions
        

        【讨论】:

        • 在这个答案中缺少--?我必须说,这种方法总体上很棒。
        • 更好的方法是使用 sudo 运行它
        【解决方案9】:

        怎么样:

        rm -rf "$(pwd -P)"/* 
        

        【讨论】:

        • jQuery 太强大了。
        【解决方案10】:

        我相信这个答案更好:

        https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

        如果您的顶级目录名为images,则运行rm -r images/*。这使用 shell glob 运算符 * 在图像中的每个文件或目录上运行 rm -r

        基本上你上一层,然后说删除 X 目录中的所有内容。这样,您仍然可以指定应该删除哪个文件夹的内容,这比仅说“删除此处的所有内容”更安全,同时保留原始文件夹(有时您想要这样做,因为您不被允许或只是不想要修改文件夹的现有权限)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-01
          • 2011-07-24
          • 2014-09-03
          相关资源
          最近更新 更多