递归删除Windows中的空目录
我的Windows 7机器上有一个目录,里面有几百个甚至上千个子目录。其中有些有文件,有些没有。我想删除所有的空目录。
看了del和rmdir DOS命令,好像不可以递归做这个事情而不删除所有的文件。有没有办法在命令行中进行?
我的Windows 7机器上有一个目录,里面有几百个甚至上千个子目录。其中有些有文件,有些没有。我想删除所有的空目录。
看了del和rmdir DOS命令,好像不可以递归做这个事情而不删除所有的文件。有没有办法在命令行中进行?
您可以使用 删除空目录 工具。
或者你也可以使用这个单行的批处理文件(来自 DownloadSquad ):
for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"
(如果在批处理文件中使用,用%d
代替%%d
)
这很有效,因为rd
不会删除包含文件的目录。
你也可以使用ROBOCOPY。它非常简单,也可以用来删除大型层次结构中的空文件夹。
ROBOCOPY folder1 folder1 /S /MOVE
这里源文件和目标文件都是folder1
,因为你只需要删除空文件夹,而不是将其他文件移动到不同的文件夹。/S
选项是为了跳过复制(移动,在上面的例子中)空文件夹。这也是比较快的,因为文件是在同一驱动器内移动的。
免费的实用程序 EmptyFolderNuker 可以很好地从你所选择的基本文件夹中删除这些内容。它还可以删除那些只包含空子目录的目录。
前面的答案对我来说都不适用,所以我做了以下文件。
EmptyDirectoriesRemove.cmd
内容:
@setlocal enableextensions enabledelayedexpansion
:walk_tree
for /D %%d in (*) do (
cd %%d
@CALL :walk_tree %%d
cd ..
rd %%d
)
endlocal
使用方法: Cd到你要清理的顶层目录。在命令行提示符下,运行。
EmptyDirectoriesRemove.cmd
非空目录会出现警告。
通常的免责声明。使用时风险自负。测试前请先进行备份等。
如果你安装了 Cygwin ,你可以这样做。
find -type d -exec rmdir {} \;
嗯……也许更简单的解决方案。
for /d /r %d in (*.*) do rd "%d"
从你想删除空文件夹的文件夹开始执行。
/d - 对文件夹有效,而不是对文件有效 /r - 对子目录进行递归。
结合Gareth和G-Man的帖子。
find . -depth -type d -empty -execdir rmdir {} +
编辑:但由于我的PATH var中的'C',所以出现了安全错误……所以取而代之的是:
$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done
我不用xargs是因为它似乎有输入行数限制(我想是1024行吧?), 而
while read x; do (command $x); done
只要有输入就会一直运行. 如果你不想看到结果和/或希望它运行得更快,就不要使用’-v'verbose标志。
4NT的shell(现在的Take Command)有一个/sx的选项是 “DEL"。/S是递归的,后缀的X是删除空目录。
如果你是在emacs中工作(使这个平台不适用),下面的方法可以用。
(defun *-delete-empty-directories (root-directory)
"Recursively delete empty directories in ROOT-DIRECTORY.
When called from dired, `dired-current-directory' is used for
ROOT-DIRECTORY."
;; Interface
(interactive (list (if (eq major-mode 'dired-mode)
(expand-file-name (dired-current-directory))
(read-from-minibuffer "Root directory: "))))
(when (or (null root-directory) (string= "" root-directory))
(user-error "No root directory provided"))
(when (called-interactively-p 'interactive)
(unless (yes-or-no-p (format "Delete all non-empty directories in `%s'? "
root-directory))
(user-error "Directory `%s' has been left untouched" root-directory)))
;; Implementation
(require 'f)
(let ((entries (f-directories root-directory)))
(while entries
(let ((curdir (car entries)))
(when (f-directories curdir)
(*-delete-empty-directories curdir))
(unless (f-entries curdir)
(delete-directory curdir)
(message "Directory deleted: `%s'" curdir))
(setq entries (cdr entries)))))