題 在Windows中遞歸刪除空目錄


我的Windows 7計算機上有一個目錄,它有數百個子目錄,有數百個子目錄。其中一些有文件,有些則沒有。我想刪除所有空目錄。

查看del和rmdir DOS命令,看起來你不能在不刪除所有文件的情況下以遞歸方式執行此操作。有沒有辦法從命令行執行此操作?


80
2017-09-11 13:38


起源


我很驚訝這個問題沒有簡單的答案。 - billpg
@billpg:簡單,因為它可以得到: xcopy FROMDIR TODIR /s。看到這個SO答案: stackoverflow.com/a/14742810 - eckes
XCOPY刪除目錄? - billpg
使用ROBOCOPY可以輕鬆完成。請參閱下面的答案了解詳情。 - Varun Sharma


答案:


您可以使用 刪除空目錄 效用。

或者,您可以使用此單行批處理文件(來自 DownloadSquad):

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"

(如果在批處理文件中使用,請替換 %d 同 %%d

這是因為 rd 不會刪除包含文件的目錄。


99
2017-09-11 13:44



P.S我建議您在嘗試任何可能刪除所有文件的命令行命令之前先嘗試基於GUI的工具。 - caliban
確保它真的是空的。隱藏的desktop.ini仍被視為文件。與thumbs.db相同。如果要驗證這是否有效,請創建一個測試目錄,其中的目錄為空並填充。它有效,我已經驗證了。 - caliban
是的。有用。我的錯。 - EBGreen
for / f%d in('dir / s / b')do rmdir“%d”應該工作,因為rmdir無法刪除非空文件夾 - seanyboy
看著 stackoverflow.com/a/34025977/694360 了解如何將此功能添加到上下文菜單。 - mmj


您也可以使用ROBOCOPY。它非常簡單,也可用於刪除大型層次結構中的空文件夾。

ROBOCOPY folder1 folder1 /S /MOVE

源和目的地都在這裡 folder1,因為您只需要刪除空文件夾,而不是將其他文件移動到不同的文件夾。 /S 選項是跳過複製(移動,在上述情況下)空文件夾。文件在同一驅動器內移動時速度也更快。


35
2017-09-13 10:25



魔法。所以這會將所有非空文件夾移動到它們已經存在的相同位置(所以什麼也沒做?),並跳過空文件夾?但那麼:為什麼跳過它們會導致刪除?並且不會將嵌套文件夾移動到 folder1?可怕,除非測試得好。 - Arjan
@Arjan我測試了它,它完美無缺!要了解它的工作原理,就像將所有文件移動到不同的位置(空文件夾除外),然後刪除留下的空文件夾。 /MOVE 首先複製文件,然後在復制後刪除源文件。這樣 /S 使用它,它將非空文件夾複製到目標(在上述情況下相同的文件夾)。然後,它刪除空文件夾(例如,它認為已經復制了空文件夾)。不,它 才不是 將嵌套文件夾移動到 folder1,因為ROBOCOPY遞歸移動文件夾。 - Varun Sharma
它甚至適用於UNC路徑(至少在win7上)!太棒了! - Arioch 'The
Robocopy可以將文件移動到回收站嗎? - user598527
這是一個非常優雅的解決方案,無需任何第三方軟件。謝謝! - Marcus Mangelsdorf


由於Cygwin附帶了GNU find,你可以這樣做:

find . -type d -empty -delete

或者在文件夾不再存在時避免噪音:

find . -type d -empty -execdir rmdir {} +

16
2017-12-31 22:52



現在也可以使用Windows 10 Bash完成此操作。 - March Ho
對於我安裝的Windows 10這個(find . -type d -empty -delete)從命令提示符失敗,出現以下錯誤: FIND: Parameter format not correct - ImpressTheNet Web Developer


免費的實用程序 EmptyFolderNuker 從您選擇的基本文件夾中做到這一點很好。它還會刪除僅包含空子目錄的目錄。


6
2017-09-11 16:08



單行批處理文件對我不起作用(我得到錯誤“%% d此時出乎意料。”),並且不會安裝刪除空目錄程序(它在鏈接頁面上顯示它不是無論如何都與Windows 7兼容)。這個程序就像一個魅力。 - Phoenix
正如user36580在下面寫的那樣,“很可能是你直接從命令行運行。在這種情況下,將雙%%更改為單個%” - Lachlan McD.
我喜歡純粹的命令行版本,因為它允許你預覽被刪除的東西。您始終可以使用命令行調用它 "%~dp0\EmptyFolderNuker.exe" %cd%。 - Jeroen Wiert Pluimers


優秀 Glary Utilities 有這個和一些其他偉大的功能。


1
2017-09-11 21:32





如果你有 Cygwin的 安裝,你可以這樣做:

find -type d -exec rmdir {} \;

1
2017-09-11 21:50



不必要。這可能不會刪除只有空子目錄的目錄。你可能不得不扭轉它。 find -type d -print0 | tac | xargs -0 rmdir - Ryan Thompson
我之前從未知道過“tac”。那真是太漂亮了! - Anthony Giorgio
或者使用 find   (starting-directory)   -depth   -type d ...。該 -depth 選項告訴 find 做一些事情,比如顛倒輸出的順序 - 它首先進入最深的目錄級別,然後重新開始工作。 - G-Man


如果您正在使用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)))))

0
2018-05-06 14:57



...請告訴我你不必輸入所有這些就可以在emacs中完成此操作。 - Hashim
@Hashim這個想法是你在init中定義它然後綁定到一個鍵。從技術上講,我可以讓它受到約束 D 如果我想,但由於我沒有共同的需要,我必須輸入的是 M-x *ded RET 和bam-done。 (如果我確實每次都要輸入這個,你絕對是對的,這是荒謬的 - 幸運的是,事實並非如此。) - Sean Allred
很公平,這聽起來更合理。 - Hashim
是否 M-x *ded RET 有任何意義還是隨機的?如果是後者,您如何跟踪您分配的所有快捷方式 emacs?記憶是否足夠,或者你發現自己必須查找它們? - Hashim
@Hashim *ded 是完整功能名稱的縮寫 *-delete-empty-directories。許多完成引擎(例如常春藤,我使用的那個)理解這種模糊匹配。至於記住他們......我根本不需要。我定義的功能都始於 * 所以如果他們沒有被鑰匙束縛,我可以很容易地找到它們。否則,emacs本身會告訴我是否有更快的方法來調用該函數。如果一切都失敗了,總會有 apropos。 - Sean Allred


結合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'詳細標記。


0
2018-04-03 09:20





嗯...也許更簡單的解決方案:

for /d /r %d in (*.*) do rd "%d"

從要刪除空文件夾的文件夾中啟動它。

/ d - 將處理文件夾,而不是文件 / r - 將遞歸子目錄


0
2017-09-02 23:41