如何使用Windows命令提示符删除空文件夹?

94

我需要使用Windows命令提示符从我的应用程序文件夹中删除所有空文件夹?

我该如何创建类似的.bat文件?

请帮帮我。

16个回答

159
您可以使用ROBOCOPY命令。它非常简单,还可以用于删除大层次结构中的空文件夹。
ROBOCOPY folder1 folder1 /S /MOVE

在这里,源文件夹和目标文件夹都是 folder1,因为您只需要删除空文件夹,而不是将其他(必需的)文件移动到不同的文件夹中。使用 /S 选项可以跳过复制(在上述情况下移动)空文件夹。此方法速度更快,因为文件移动在同一驱动器内进行。


3
好的,这看起来很不错并且有效!我只是不明白为什么如果从项目文件夹内运行cmd,则会出现“错误32(0x00000020)删除源目录”的情况 - 这意味着它无法删除主目录!感谢上帝它不能删除它,因为它不应该-它不是空的!(“由于正在被另一个进程使用,因此无法访问该文件。”其中文件必须是该目录)。我在其中使用以下命令运行:robocopy . . /s /move。 - Pedro Reis
1
@PedroReis,我认为你遇到这个错误是因为在子文件/文件夹仍然打开的情况下尝试删除/移动它。如果你需要更多帮助,我建议你将其作为一个新问题发布,这样其他遇到此问题的人就可以找到你的问题并解决他们的问题。 - Varun Sharma
1
Robocopy看起来是一个诱人且简单的解决方案,但它无法处理嵌套的空文件夹。如果您有一个空文件夹在另一个空文件夹内部,您需要运行两次Robocopy脚本才能删除两个文件夹。如果您有3或4个嵌套的文件夹,则需要运行3或4次。 - SS64
@ss64 我刚刚测试了 ROBOCOPY 并且它成功地在单次运行中删除了嵌套的空文件夹。 - Varun Sharma
创建 demo 文件夹 进入 demo 文件夹 创建 aa 文件夹 创建 bb 文件夹 进入 aa 文件夹 创建 sub1 文件夹 返回上一级目录 返回 demo 目录 使用 robocopy 命令将 demo 目录移动到 demo 目录下 结果是 bb 和 sub1 被删除,但 aa 没有被删除。 - SS64
显示剩余8条评论

64
一个更简单的方法是使用 /s 开关进行 xcopy,复制整个目录结构。/s 的帮助文档说“复制目录和子目录,但排除空目录。”

一个更简单的方法是使用/s开关运行xcopy以复制整个目录结构。/s的说明是“复制除空目录外的目录和子目录”。

xcopy dirA dirB /S

其中dirA是具有空文件夹的源文件夹。DirB将是不包含空文件夹的副本。


1
这应该是被接受的答案。简单明了!谢谢! - eckes
4
添加/I开关,例如 xcopy dirA dirB /SI 将跳过提示,“dirB是目标上的文件名还是目录名?” - user87453
32
我同意这很简单,但是我的目录结构有超过1TB的数据。我不想复制它! - JYelton
你可以使用RoboCopy实现类似的功能,而且不需要复制空文件夹。我想这对于复制数据可能很有用,但如果你想修剪空文件夹的话就不适用了。 - Sun
5
请注意,这不会复制隐藏和系统文件-如果需要,请添加 /h 标志。 - SamStephens
在这种情况下,@JYelton,请使用/T /E选项复制文件夹结构而无需复制文件。 - Eric

59
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

来自: http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx

当然,在执行该命令之前,我会先进行测试而不是直接删除。此外,以下是评论中包含带空格文件夹的修改版本:

 for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"

附言:博客文章中有更多的评论可能会对你有所帮助,因此在尝试此操作之前,请确保先阅读这些评论。


2
我喜欢这个。这里的链接提到这个更容易(类似于下面的代码):for /f "tokens=*" %%d in ('dir /ad/b/s ^| sort /R') do rd "%%d" - Brad W
你把文件夹路径放在哪里? - MAGx2
1
@MAGx2 我也有这个问题。我不知道如何在评论中发布反引号,但我正在使用([backquote]dir /ad/b/s "c:\path"[backquote])。 - Jason
1
如果您在批处理文件中不使用上面的行,则需要使用 %d 替换 %%d - svandragt
1
可以使用ROBOCOPY轻松完成。请查看下面的答案以获取详细信息。 - Varun Sharma
显示剩余5条评论

17

你不需要使用 usebackq:

FOR /F delims^= %%A IN ('DIR/AD/B/S^|SORT/R') DO RD "%%A"

7
谢谢Tom...你说得对。但是在命令行中,应该使用单个百分号而不是批处理文件。 用户注意:RD命令不会删除包含文件的目录或文件本身,只会清空其中的文件夹。所以这是完全安全的。用 FOR /F delims^= %A IN ('DIR/AD/B/S^|SORT/R') DO RD "%A" 命令可以实现此功能。 - user3326879
如果您正在使用cygwin,请确保检查您的路径顺序,或者明确地将SORT指向dos版本。 - Sun

8

除了同一引用页面的腐蚀答案外,还有一个PowerShell版本 http://blogs.msdn.com/b/oldnewthing/archive/2008/04/17/8399914.aspx#8408736

Get-ChildItem -Recurse . | where { $_.PSISContainer -and @( $_ | Get-ChildItem ).Count -eq 0 } | Remove-Item

更简洁的写法:

gci -R . | where { $_.PSISContainer -and @( $_ | gci ).Count -eq 0 } | ri

功劳归于发布者。


5

从命令行执行: for /R /D %1 in (*) do rd "%1"

在批处理文件中执行: for /R /D %%1 in (*) do rd "%%1"

我不知道它是否被正式文档记录,但它可以在W2K、XP和Win 7上使用。我也不知道它是否永远都有效,但它不会意外删除文件。


3

它应该能够很好地工作。这是递归删除旧文件和空目录的最佳方法。 以下是 .bat 文件:

forfiles /p [PATH] /s /m [FILE-PATTERN] /d -[DAYS] /c "cmd /c del @path"
for /f "delims=" %%d in ('dir [PATH] /s /b /ad ^| sort /r') do rd "%%d"

需要将占位符替换为以下内容(不带引号):
[DAYS] = Max. age of the files in days, e.g. “10”
[PATH] = Path to search for old files and empty folders, e.g. “C:\Backup\”
[FILE-PATTERN] = Pattern that matches files to delete, e.g. “*.bkp”

脚本已经在Windows 7和Windows Server 2003上成功测试过。

3

这是以上方法的混合体。它会删除给定路径下所有早于X天的文件,并删除任何空文件夹。只需设置天数、文件夹路径和驱动器即可使用。

@echo off
SETLOCAL
set days=30
set folderpath=E:\TEST\
set drive=E:

::Delete files
forfiles -p %folderpath% -s -d -%days% -c "cmd /c del /q @path "

::Delete folders
cd %folderpath%
%drive%
for /f "usebackq delims=" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d"`

3
不错,但我需要在最后一行移除撇号。 使用以下命令可以递归删除所有空文件夹: for /f "usebackq delims=" %%d in ("dir /ad/b/s | sort /R") do rd "%%d" - integratorIT

2

安装任何适用于Windows的UNIX解释器(例如Cygwin或Git Bash),然后运行以下命令:

find /path/to/directory -empty -type d

该命令将在指定目录下查找所有空文件夹。

To find them

find /path/to/directory -empty -type d -delete

To delete them

(实际上并没有使用Windows命令提示符,但这很容易且只需几秒钟即可运行)


加十分是因为包括了如何仅仅“找到”它们。 - Bob Stein
在我的版本中,find命令可以正常工作,但是当添加-delete选项时,它会显示“无效的谓词-delete”。 - OMA

0

如果您想在资源管理器上下文菜单(即右键单击)中使用Varun的ROBOCOPY命令行,这里提供了一个Windows注册表导入文件。我尝试将其添加为评论到他的答案中,但内联标记不可行。

我已在自己的Windows 10 PC上测试过此方法,但请自行承担风险。它将打开一个新的命令提示符窗口,运行命令,并暂停以便您查看输出。

  1. 复制以下内容到一个新的文本文件中:

    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Classes\directory\Background\shell\Delete Empty Folders\command] @="C:\Windows\System32\Cmd.exe /C \"C:\Windows\System32\Robocopy.exe \"%V\" \"%V\" /s /move\" && PAUSE"

    [HKEY_CURRENT_USER\Software\Classes\directory\shell\Delete Empty Folders\command] @="C:\Windows\System32\Cmd.exe /C \"C:\Windows\System32\Robocopy.exe \"%V\" \"%V\" /s /move\" && PAUSE"

  2. 将.txt扩展名改为.reg

  3. 双击导入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接