我的Windows 7计算机上有一个目录,该目录具有数百个(如果不是数千个)子目录。其中有些文件,有些则没有。我要删除所有空目录。
查看del和rmdir DOS命令,您似乎可以递归地执行此操作而不删除所有文件。有没有办法从命令行执行此操作?
xcopy FROMDIR TODIR /s
。看到这样的答案:stackoverflow.com/a/14742810
我的Windows 7计算机上有一个目录,该目录具有数百个(如果不是数千个)子目录。其中有些文件,有些则没有。我要删除所有空目录。
查看del和rmdir DOS命令,您似乎可以递归地执行此操作而不删除所有文件。有没有办法从命令行执行此操作?
xcopy FROMDIR TODIR /s
。看到这样的答案:stackoverflow.com/a/14742810
Answers:
您可以使用“ 删除空目录”实用程序。
或者,您可以使用此单行批处理文件(来自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
选项是跳过复制(在上述情况下移动)空文件夹。由于文件在同一驱动器内移动,因此速度也更快。
folder1
吗?可怕,除非经过良好测试。
/MOVE
首先复制文件,然后在复制后删除源文件。因此,如/S
所使用的,它将非空文件夹复制到目的地(在上述情况下为相同文件夹)。然后,它删除空白文件夹(例如,认为空白文件夹已被复制)。不,它不会将嵌套文件夹移动到folder1
,因为ROBOCOPY会递归移动文件夹。
由于Cygwin随附GNU find,因此您可以执行以下操作:
find . -type d -empty -delete
或为了避免文件夹不再存在时的噪音:
find . -type d -empty -execdir rmdir {} +
find . -type d -empty -delete
)在命令提示符下失败,并显示以下错误:FIND: Parameter format not correct
免费的EmptyFolderNuker实用程序可以从您选择的基本文件夹中完成此操作。它还会删除那些仅包含空子目录的目录。
"%~dp0\EmptyFolderNuker.exe" %cd%
。
如果安装了Cygwin,则可以执行以下操作:
find -type d -exec rmdir {} \;
find
(starting-directory)
-depth
-type d ...
-depth
find
如果您在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)))))
D
如果我愿意的话,可以绑定它,但是由于我对此没有共同的需求,因此我只需要输入M-x *ded RET
bam–done。(如果我确实确实必须每次都键入此内容,那是荒谬的,这是绝对正确的-幸运的是,情况并非如此。)
M-x *ded RET
有任何的意义还是随机的?如果是后者,如何跟踪分配给您的所有快捷方式emacs
?备忘录足够吗?还是您发现自己必须查抄它们?
*ded
是完整功能名称的缩写*-delete-empty-directories
。许多完成引擎(例如常春藤,我使用的引擎)都了解这种模糊匹配。至于要记住它们……我根本不必这样做。我定义的功能都是从此开始的,*
因此如果它们未绑定到键,我可以轻松找到它们。否则,emacs本身会告诉我是否有调用该函数的更快方法。如果所有其他方法都失败了,那么总有apropos
。
结合Gareth和G-Man的帖子:
find . -depth -type d -empty -execdir rmdir {} +
编辑:但是由于在我的PATH变量中存在“ C”,因此产生了安全错误...
$find . -depth -type d -empty | while read dir; do (rmdir -v $dir); done
我不使用xargs,因为它似乎有一个输入行限制(我认为大约是1024行),而
while read x; do (command $x); done
只要有输入就一直持续下去。如果您不想看到结果和/或希望它运行得更快,请省去“ -v”详细标志。