it-swarm-ja.com

Windowsで空のディレクトリを再帰的に削除する

私は自分のWindows 7マシン上に何千ものサブディレクトリを持っていないとしても数百のディレクトリを持っています。それらのいくつかはファイルを持っていますが、いくつかは持っていません。空のディレクトリをすべて削除したい。

Delおよびrmdir DOSコマンドを見ると、すべてのファイルを削除せずに再帰的にこれを実行できるようには見えません。コマンドラインからこれを行う方法はありますか?

87
mohlsen

あなたは 空のディレクトリを削除する ユーティリティを使うことができます。

あるいは、このワンライナーバッチファイルを使用することもできます( DownloadSquad から)。

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

(バッチファイル内で使用する場合は、%d%%dに置き換えます)

rdはファイルを含むディレクトリを削除しないので、これはうまくいきます。

106
caliban

ROBOCOPYも使えます。それは非常に簡単で、大きな階層の中の空のフォルダを削除するのにも使うことができます。

ROBOCOPY folder1 folder1 /S /MOVE

他のファイルを別のフォルダに移動するのではなく、空のフォルダを削除するだけでよいため、ここでは移動元と移動先の両方がfolder1です。 /Sオプションは空のフォルダのコピー(上記の場合は移動)をスキップすることです。ファイルが同じドライブの中に移動されるので、それはより速いです。

41
Varun Sharma

CygwinにはGNU findが付属しているので、これを実行できます。

find . -type d -empty -delete

フォルダが存在しなくなったときのノイズを避けるために

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

無料のユーティリティ EmptyFolderNuker は、あなたが選んだベースフォルダから、これでうまくいきます。空のサブディレクトリのみを含むディレクトリも削除されます。

6
Rob Kam

すばらしい Glary Utilities はこれと他のすばらしい機能をたくさん持っています。

1
outsideblasts

もしあなたが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
Sean Allred

うーん...多分もっと簡単な解決策:

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

空のフォルダを削除するフォルダから開始してください。

/ d - フォルダではなく、ファイルで動作します。/ r - サブディレクトリを再帰します。

0

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'冗長フラグを省略してください。

0
skeetastax

Cygwin がインストールされている場合は、次のようにします。

find -type d -exec rmdir {} \;
0
Anthony Giorgio