【问题标题】:"rm -rf" equivalent for Windows?Windows 的“rm -rf”等效项?
【发布时间】:2010-09-11 00:06:10
【问题描述】:

我需要一种递归删除文件夹及其子文件夹的方法。

是否有为此预先构建的工具,还是我需要编写一个?

DEL /S 不会删除目录。

DELTREE 已从 Windows 2000+ 中删除

【问题讨论】:

  • 是否 del /s (a) 根本不起作用(仅在某些版本中可用)或 (b) 离开顶级目录但删除其下的所有内容或 (c) 保留所有目录同时删除所有文件?
  • @Aaron,答案c,你需要使用rmdir /s来删除目录和文件。

标签: windows cmd wsh


【解决方案1】:

在powershell中,rm是Remove-Item的别名,所以删除一个文件,

rm -R -Fo the_file

等价于

Remove-Item -R -Fo the_file

如果您对 gnu rm util 感到满意,您可以在 windows 上使用 rm util by choco 包管理器。

使用choco在powershell中安装gnu utils:

choco install GnuWin

终于,

rm.exe -rf the_file

【讨论】:

    【解决方案2】:

    Windows 注册表编辑器 5.00 版

    [HKEY_CLASSES_ROOT\Folder\shell\rmdir\command]
    @="cmd.exe /s /c rmdir "%V""

    【讨论】:

      【解决方案3】:

      作为侧节点:

      从带有所有子目录的 linux 版本(递归)+ 强制删除

      $ rm -rf ./path

      到 PowerShell

      PS> rm -r -fo ./path

      具有接近相同的参数(只是分开)(需要-fo,因为-f可以匹配不同的其他参数)

      注意:

      Remove-Item ALIASE
          ri
          rm
          rmdir
          del
          erase
          rd
      

      【讨论】:

        【解决方案4】:

        在 powershell 中 rm -recurse -force 工作得很好。

        【讨论】:

        【解决方案5】:

        如果您使用的是旧版本的 Windows,还有 deltree。

        您可以从这里了解更多信息: SS64: DELTREE - Delete all subfolders and files.

        【讨论】:

          【解决方案6】:
          rm -r -fo <path>
          

          是您可以在 Windows PowerShell 中获得的最接近的值。是的缩写

          Remove-Item -Recurse -Force -Path <path>
          

          (more details).

          【讨论】:

          • 谢谢!这个建议实际上在 Windows 终端中有效。
          【解决方案7】:

          迟到但重要的答案给在 Windows 机器上安装 npm 软件包时遇到问题的任何人,如果您看到错误提示“rm -rf...”命令未找到。 你可以使用bash cli在windows上运行rm命令。

          对于 npm 用户,您可以通过这种方式将 npm 的配置更改为 npm config set script-shell "C:\Program Files\Git\bin\bash.exe",如果您尝试安装的 npm 软件包有一个使用 rm -rf 命令的 post install script,您将能够运行该 rm命令无需更改 npm 包中的任何内容或禁用安装后脚本配置。 (例如,styled-components 在其安装后脚本中使用 rm 命令)

          如果您只想使用rm 命令,您可以轻松使用 bash 并传递参数。

          是的,您可以在 Windows 上使用“rm”命令。

          【讨论】:

            【解决方案8】:

            如果您使用的是经典命令提示符 (cmd.exe),则为 RMDIR 或 RD:

            rd /s /q "path"
            

            RMDIR [/S] [/Q] [驱动器:]路径

            RD [/S] [/Q] [驱动器:]路径

            /S 除目录本身外,删除指定目录中的所有目录和文件。 用于删除目录树。

            /Q 安静模式,不询问是否可以用 /S 删除目录树

            如果您使用的是 PowerShell,则可以使用 Remove-Item(别名为 deleraserdrirmrmdir)并采用 -Recurse 参数可以短接为-r

            rd -r "path"
            

            【讨论】:

            • 值得指出的是,对于大量文件,rmdir /s /q 通常明显快于资源管理器中等效的“选择目录,移位+删除”操作。
            • 这不会像 rm -rf 那样删除文件,并且当目录不存在时它也会返回一个非零值,所以如果目录 "foo" 不存在,rd /s /q foo &amp;&amp; echo "yay" 将失败'不存在。
            • 如果目录。不为空,一些文件得到Access is denied 和其他The process cannot access the file because it is being used by another process
            • 我刚试了七次,你需要做 /S 和 /Q(大写)
            • 也许它在一些较旧的窗口中工作。但现在它根本不起作用。
            【解决方案9】:

            使用风险自负。信息按“原样”提供。未经广泛测试。

            右键单击 Windows 图标(通常是左下角)> 单击“Windows PowerShell(管理员)”> 使用此命令(请注意,如果不小心,您可以轻松删除所有文件):

            rd -r -include *.* -force somedir
            

            其中somedir 是您要删除的非空目录。

            请注意,对于外部连接的磁盘或有问题的磁盘,Windows 有时会表现得很奇怪 - 它在删除(或任何复制尝试)时不会出错,但目录并未按照指示删除(或未复制)。 (我发现在这种情况下,至少对我而言,@n_y 在他的回答中给出的命令会产生类似“get-childitem:文件或目录已损坏且无法读取。”这样的错误,因此在 PowerShell 中)

            【讨论】:

              【解决方案10】:

              公认的答案很好,但假设您安装了 Node,您可以使用允许通配模式的节点库“rimraf”更精确地做到这一点。如果您经常使用它(我经常使用),只需全局安装即可。

              yarn global add rimraf
              

              然后,例如,我经常使用的模式:

              rimraf .\**\node_modules
              

              或者对于一个可以让你避开全局安装的单线器,但是对于包动态下载来说需要更长的时间:

              npx rimraf .\**\node_modules
              

              【讨论】:

              • 该问题的可靠解决方案,因为它与操作系统无关。
              【解决方案11】:

              通过 Powershell

               Remove-Item -Recurse -Force "TestDirectory"
              

              通过命令提示符

              https://stackoverflow.com/a/35731786/439130

              【讨论】:

                【解决方案12】:

                使用 Powershell 5.1

                 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
                

                logs 替换为您要删除的目录名称。

                get-childitem 从当前路径 (.) 递归搜索名称为子目录。

                remove-item 删除结果。

                【讨论】:

                  【解决方案13】:

                  RMDIR <strong>[/S]</strong> [/Q] [drive:]path

                  RD <strong>[/S]</strong> [/Q] [drive:]path

                  • /S 除目录本身外,删除指定目录中的所有目录和文件。 用于删除目录树。

                  • /Q安静模式,不询问是否可以删除带有/S的目录树

                  【讨论】:

                  • 感谢参数说明。不幸的是,接受的答案没有这样做。
                  • 对问题的最简单、完美的回答。应该是被接受的。
                  【解决方案14】:

                  要删除目录(无论它是否存在),请使用以下命令:

                  if exist myfolder ( rmdir /s/q myfolder )
                  

                  【讨论】:

                  • 其实这就是答案。谢谢@Clay
                  【解决方案15】:

                  转到路径并触发此命令。

                  rd /s /q "FOLDER_NAME"
                  

                  /s :删除指定目录和所有子目录,包括任何文件。使用 /s 删除一棵树。

                  /q : 以安静模式运行 rmdir。删除目录而不确认。

                  /? : 在命令提示符处显示帮助。

                  【讨论】:

                    【解决方案16】:

                    首先,让我们回顾一下rm -rf 的作用:

                    C:\Users\ohnob\things>touch stuff.txt
                    
                    C:\Users\ohnob\things>rm -rf stuff.txt
                    
                    C:\Users\ohnob\things>mkdir stuff.txt
                    
                    C:\Users\ohnob\things>rm -rf stuff.txt
                    
                    C:\Users\ohnob\things>ls -l
                    total 0
                    
                    C:\Users\ohnob\things>rm -rf stuff.txt
                    

                    rm -rf 常用的三种场景,预期返回0

                    1. 指定的路径不存在。
                    2. 指定路径存在且是目录。
                    3. 指定的路径存在并且是一个文件。

                    我将忽略整个权限问题,但无论如何,没有人会使用权限或试图拒绝自己对 Windows 中的事物的写入权限(好吧,这只是个玩笑……)。

                    首先set ERRORLEVEL to 0,然后仅在路径存在时删除路径,根据是否为目录使用不同的命令。如果路径不存在,IF EXIST 不会将 ERRORLEVEL 设置为 0,因此必须首先将 ERRORLEVEL 设置为 0,以便以模仿正常 rm -rf 使用的方式正确检测成功。用IF EXIST 保护RD 是必要的,因为RDrm -f 不同,如果目标不存在,则会引发错误。

                    以下脚本 sn-p 假定 DELPATH 已预先引用。 (当您执行SET DELPATH=%1 之类的操作时,这是安全的。尝试将ECHO %1 放入.cmd 并传递一个带有空格的参数,然后看看会发生什么)。 sn -p 完成后,您可以使用IF ERRORLEVEL 1 检查是否失败。

                    : # Determine whether we need to invoke DEL or RD or do nothing.
                    SET DELPATH_DELMETHOD=RD
                    PUSHD %DELPATH% 2>NUL
                    IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
                    IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
                    : # Reset ERRORLEVEL so that the last command which
                    : # otherwise set it does not cause us to falsely detect
                    : # failure.
                    CMD /C EXIT 0
                    IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
                    IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%
                    

                    关键是,当环境符合 POSIX 时,一切都会变得更简单。或者,如果您安装了一个最小的 MSYS 并使用它。

                    【讨论】:

                      【解决方案17】:

                      这对我有用:

                      只需尝试减少路径的长度。 即 :: 将导致此类文件的所有文件夹重命名为尽可能小的名称。说出一个字母的名字。继续在文件夹层次结构中向上重命名。 通过这个你有效地减少了路径长度。 现在终于尝试立即删除文件。

                      【讨论】:

                        【解决方案18】:

                        管理员:

                        takeown /r /f folder
                        cacls folder /c /G "ADMINNAME":F /T
                        rmdir /s folder
                        

                        适用于任何东西,包括 sys 文件

                        编辑:我实际上找到了解决文件路径太长问题的最佳方法:

                        mkdir \empty
                        robocopy /mir \empty folder
                        

                        【讨论】:

                        • 我的英雄!还有一个提示:你在 C:\empty 创建你的空文件夹,然后在每个疯狂的文件夹中,你可以做robocopy /mir c:\empty .
                        • takeown 帮助了我,因为我错误地使用 rsync 从 Linux 系统复制了文件夹,并且我没有删除该文件夹的权限......甚至 robocopy 都没有工作。谢谢
                        • 非常好的答案。有用。 (页面上的所有其他答案都没有)。但是 cacls 已被弃用。请问能不能给个当代答案?第二个变体已经可以使用并且没有被弃用。
                        • 这对我没有任何作用。有人可以解释一下它应该如何工作吗? (robocopy) - 它可能会删除文件夹的内容,但不会删除文件夹本身
                        • @bilal substitution"adminname" 使用您的实际帐户名称。
                        【解决方案19】:

                        这是你需要做的……

                        使用以下行创建一个批处理文件

                        RMDIR /S %1

                        将你的批处理文件保存为Remove.bat并放入C:\windows

                        创建以下注册表项

                        HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

                        启动regedit 并更新默认值HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default 具有以下值

                        "c:\windows\REMOVE.bat" "%1"

                        就是这样!现在您可以右键单击任何目录并使用 RMDIR 功能

                        【讨论】:

                        • 这是一个很好的开始,但是不需要批处理文件:cmd.exe /s /c rmdir "%V" 就足够了
                        【解决方案20】:

                        您可以安装 GnuWin32 并在 Windows 上本地使用 *nix 命令。我先安装它,然后再在 Windows 的薄荷味新副本上安装其他任何东西。 :)

                        【讨论】:

                          【解决方案21】:

                          你可以安装cygwin,有rmls等。

                          【讨论】:

                            【解决方案22】:

                            rmdir /S /Q %DIRNAME%

                            【讨论】:

                              【解决方案23】:

                              试试这个命令:

                              del /s foldername
                              

                              【讨论】:

                              • 与 rmdir /s /q 组合为我工作,因为某些文件被锁定,而 rmdir 会在这些文件上失败。 del / foldername 核对锁定的文件,然后允许 rmdir 摆脱根目录。不错。
                              【解决方案24】:

                              rmdir /s 目录名

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2021-10-30
                                • 2021-03-28
                                • 2012-10-05
                                • 2011-02-28
                                • 2021-04-09
                                • 2013-01-10
                                • 2012-05-13
                                • 2014-06-26
                                相关资源
                                最近更新 更多