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


77

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

我该如何创建一个bat文件?

请帮我。

Answers:


53
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"

附言:博客文章中有更多评论可能会对您有所帮助,因此在尝试之前,请务必阅读这些评论


1
我喜欢这一个。此处的链接提到此操作更简单(类似于下面的操作):for /f "tokens=*" %%d in ('dir /ad/b/s ^| sort /R') do rd "%%d"
Brad W

您在哪里放置文件夹的路径?
MAGx2 2014年

1
@ MAGx2我也有这个问题。我不知道如何在评论中添加反引号,但我使用的是([backquote] dir / ad / b / s“ c:\ path” [backquote])
Jason

1
如果您不在批处理文件中使用上述行,则需要替换%%d%d
svandragt

1
使用ROBOCOPY可以轻松完成。请参阅下面的详细信息。
Varun Sharma 2015年

126

您可以使用该ROBOCOPY命令。这非常简单,还可以用于删除大型层次结构中的空文件夹。

ROBOCOPY folder1 folder1 /S /MOVE

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


1
喜欢robocopy解决方案。谢谢!
Buzzy Hopewell

1
非常好!+1为答案。
JasonXA '16

1
救生员答案。
John Woo

2
好的,这看起来不错,可以正常工作!我只是不明白为什么,如果从项目文件夹中运行cmd,它会给我“错误32(0x00000020)删除源目录”的信息-这意味着它无法删除主目录!谢天谢地,它不能删除它,因为它不应该删除-它不为空!(“该进程无法访问该文件,因为它正在被另一个进程使用。”-其中文件必须是目录)。我正在其中运行:robocopy。。/ s /移动。
Pedro Reis

1
@PedroReis据我说,您在尝试删除/移动子文件/文件夹仍处于打开状态时遇到此错误。如果您需要更多帮助,我认为最好将其发布为新问题,以便其他面临此问题的人可以找到您的问题并解决他们的问题。
Varun Sharma

58

一种简单的方法是使用/ s开关执行xcopy来复制整个目录结构。/ s的帮助说,复制目录和子目录(空目录除外)。

xcopy dirA dirB /S

dirA是带有空文件夹的源。DirB将是没有空文件夹的副本


1
应该是公认的答案。漂亮又简单!谢谢!
eckes

4
添加/ I开关,例如xcopy dirA dirB /SI将跳过提示“ dirB是否在目标上指定文件名或目录名?”的提示。
路加·桑普森

29
我同意这很简单,但是我有一个包含1TB以上数据的目录结构。我不想重复那个!
JYelton

您可以使用RoboCopy做类似的事情,而不是复制空文件夹。我想如果要复制数据很有用,但是如果要修剪空文件夹则没有用。
2014年

5
另外要注意,这不复制隐藏文件和系统文件-包括了/ h的标志
SamStephens

16

您不需要usebackq:

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

5
谢谢汤姆...你是对的。但是,在命令行中,它实际上将使用与批处理文件相反的单个%。用户:请注意,RD不会删除文件,也不会删除包含文件的目录。只是空目录。因此,这是完全安全的。FOR / F delims ^ =%A IN('DIR / AD / B / S ^ | SORT / R')DO RD“%A”

如果您使用的是cygwin,请确保检查路径顺序,或将SORT明确指向dos版本。
太阳


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"`

1
好的,但我有用于在/ F最后一行的“有usebackq delims =” d的%%到底(以除去apostrof "dir /ad/b/s | sort /R")做RD“%% d”
integratorIT

3

从命令行:对于(R)中的/ R / D%1,执行rd“%1”

在(*)中的/ R / D %% 1的批处理文件中,执行rd“ %% 1”

我不知道它是否已被记录下来,但是它可以在W2K,XP和Win 7中使用。我也不知道它是否始终可以工作,但是它永远不会偶然删除文件。


1

为Windows安装任何UNIX解释器(Cygwin或Git Bash)并运行cmd:

查找/ path / to / directory-空-type d

To find them

查找/路径/到/目录-空-类型d-删除

To delete them

(不是真的使用Windows cmd提示符,但是很容易,并且花了几秒钟来运行)


再加上十个,包括如何找到它们。
鲍勃·斯坦

在我的find版本中,第一个命令有效,但是在添加-delete时说“无效谓词-delete”
OMA

1

它将工作正常。这是删除旧文件并递归删除空目录的最佳方法。以下.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下成功测试。


0
@echo off
set /p "ipa= ENTER FOLDER NAME TO DELETE> "
set ipad="%ipa%"
IF not EXIST %ipad% GOTO notfound
IF EXIST %ipad% GOTO found
:found
echo DONOT CLOSE THIS WINDOW
md ccooppyy
xcopy %ipad%\*.* ccooppyy /s > NUL
rd %ipad% /s /q
ren ccooppyy %ipad%
cls
echo SUCCESS, PRESS ANY KEY TO EXIT
pause > NUL
exit 
:notfound
echo I COULDN'T FIND THE FOLDER %ipad%
pause
exit

0

如果要在资源管理器上下文菜单中使用Varun的ROBOCOPY命令行(即,单击鼠标右键),则这里是Windows注册表导入。我尝试将其添加为他的答案的注释,但是内联标记不可行。

我已经在自己的Windows 10 PC上进行了测试,但使用后果自负。它将打开一个新的命令提示符,运行该命令,然后暂停,以便您可以看到输出。

  1. 复制到新的文本文件中:

    Windows注册表编辑器版本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 /移动\” &&暂停“

    [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 /移动\“ &&暂停”

  2. 将.txt扩展名重命名为.reg

  3. 双击导入。

谢谢Varun Sharma的原创。
Casey Plummer

-1

好吧,对于没有空格的简单1级目录结构,[edit]以及仅包含一种我认为有用的文件的目录,这只是一个快速而肮脏的建议(有时来自http://www.pcreview.co.uk /forums/can-check-if-folder-empty-bat-file-t1468868.html):

for /f %a in ('dir /ad/b') do if not exist %a\*.xml echo %a Empty

/ ad:仅显示目录条目
/ b:使用裸格式(仅名称)

[编辑]使用纯星号检查任何文件(上述%a \ *)将不起作用,感谢您的纠正

因此,删除将是:

for /f %a in ('dir /ad/b') do if not exist %a\*.xml rmdir %a

1
即使目录为空,上述测试也会通过。
Steve Hollasch '16

@SteveHollasch感谢您的评论,我更正了上面的代码
hello_earth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.