2009-09-11 13:38:58 +0000 2009-09-11 13:38:58 +0000
100
100

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

私のWindows 7のマシンには、数百、数千ではないにしても数百のサブディレクトリがあるディレクトリがあります。その中にはファイルを持っているものもあれば、持っていないものもあります。空のディレクトリをすべて削除したい。

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

回答 (9)

121
121
121
2009-09-11 13:44:35 +0000

空のディレクトリの削除](http://www.jonasjohn.de/lab/red.htm) ユーティリティを使用することができます。

あるいは、以下の1行のバッチファイル( DownloadSquad から)を使用することもできます:

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

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

これは、rd がファイルを含むディレクトリを削除しないために機能します。

53
53
53
2015-09-13 10:25:42 +0000

ROBOCOPYも使えます。非常にシンプルで、大きな階層内の空フォルダの削除にも使えます。

ROBOCOPY folder1 folder1 /S /MOVE

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

7
7
7
2009-09-11 16:08:08 +0000

フリーのユーティリティ EmptyFolderNuker は、お好みのベースフォルダからこれを実行します。また、空のサブディレクトリだけを含むディレクトリも削除します。

0
0
0
2019-12-13 04:09:18 +0000

前の回答ではどれもうまくいかなかったので、以下のファイルを作ってみました。

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

空でないディレクトリに対して警告が表示されます。

通常の免責事項。自己責任で使用してください。テスト前にバックアップを取ってください。

0
0
0
2009-09-11 21:50:13 +0000
0
0
0
2018-09-02 23:41:02 +0000

うーん…もっとシンプルな解決策があるかもしれません。

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

空のフォルダを削除したいフォルダから起動します。

/d - ファイルではなくフォルダに対して動作します。

0
0
0
2017-04-03 09:20:06 +0000

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 を使わないのは、xargs には入力行数の制限があるように見えるからです(1024行くらいだと思います)。結果を見たくない場合や、より速く実行したい場合は、’-v’ verbose フラグを省略してください。

0
0
0
2020-01-10 08:31:27 +0000

4NTシェル(最近ではTake Command)には、/sxオプションで「DEL」があります。/sは再帰的で、付加されたxは空のdirを削除します。

0
0
0
2015-05-06 14:57:59 +0000

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)))))