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


94

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

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


この質問に対する簡単な答えがないことに驚いています。
-billpg

@billpg:それは得ることができるような単純な:xcopy FROMDIR TODIR /s。:これはSOお答えくださいstackoverflow.com/a/14742810
eckes

1
XCOPYはディレクトリを削除しますか?
billpg

1
ROBOCOPYを使用して簡単に実行できます。詳細については、以下の私の回答をご覧ください。
ヴァルンシャルマ

回答:


116

空のディレクトリの削除ユーティリティを使用できます。

または、次のワンライナーバッチファイル(DownloadSquadから)を使用できます。

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

(バッチファイル内で使用された場合、交換する%d%%d

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


6
PSすべてのファイルを削除する可能性のあるコマンドラインコマンドを試す前に、まずGUIベースのツールを試すことをお勧めします。
カリバン

1
本当に空であることを確認してください。非表示のdesktop.iniは、引き続きファイルと見なされます。thumbs.dbと同じです。これが機能するかどうかを確認する場合は、空でデータが入っているディレクトリを含むテストディレクトリを作成します。動作していることを確認しました。
カリバン

1
うん。できます。私の間違い。
EBGreen

8
/ F%D( 'DIR / S / B')中のためのrmdir "%dは、" rmdirをとして動作するはずない非空のフォルダ削除することはできません
seanyboy

1
stackoverflow.com/a/34025977/694360を見て、この機能をコンテキストメニューに追加する方法を確認してください。
mmj

49

ROBOCOPYを使用することもできます。非常にシンプルで、大きな階層内の空のフォルダーを削除するためにも使用できます。

ROBOCOPY folder1 folder1 /S /MOVE

ここではfolder1、他のファイルを別のフォルダーに移動するのではなく、空のフォルダーのみを削除する必要があるため、ソースと宛先は両方ともです。/Sオプションは、空のフォルダーのコピー(上記の場合は移動)をスキップすることです。また、ファイルが同じドライブ内で移動されるため、高速です。


1
魔法。それで、これはすべての空ではないフォルダーを既に存在していた同じ場所に移動し(何もしませんか?)、空のフォルダーをスキップしますか?しかし、その後、なぜそれらをスキップすると削除されるのでしょうか?そして、これはネストされたフォルダをに移動しませんfolder1か?よくテストしない限り、怖い。
アルジャン

3
@Arjan私はそれをテストしましたが、完璧に動作します!その動作を理解するために、空のフォルダーを除くすべてのファイルを別の場所に移動してから、空のフォルダーを削除します。/MOVE最初にファイルをコピーし、コピー後にソースファイルを削除します。したがって、/S使用されているように、空ではないフォルダーを宛先(上記の場合は同じフォルダー)にコピーします。次に、空のフォルダーを削除します(空のフォルダーは既にコピーされていると考えるなど)。いいえ、ROBOCOPYはフォルダーを再帰的に移動するため、ネストされたフォルダーをに移動しませんfolder1
ヴァルンシャルマ

3
UNCパスでも機能します(少なくともwin7では)。素晴らしい!
アリオク

2
これは、サードパーティのソフトウェアを必要としない非常にエレガントなソリューションです。ありがとうございました!
マーカスマンゲスドルフ

1
これは魔法をかけ、完璧に機能しました。ありがとう!
CharleyDC5

15

CygwinにはGNU findが付属しているため、これを行うことができます。

find . -type d -empty -delete

または、フォルダーが存在しなくなったときのノイズを回避するには:

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

これは、Windows 10 Bashを使用して行うこともできます。
3月Ho

私のこれが(Windowsの10のインストールの場合find . -type d -empty -delete:)次のエラーでコマンド・プロンプトから、失敗したFIND: Parameter format not correct
ImpressTheNet Web Developerの

7

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


1
ワンライナーバッチファイルは機能しませんでした(「%% dは現時点では予期していませんでした」というエラーが表示されます)。RemoveEmpty Directoriesプログラムはインストールされません(リンクされたページではとにかくWindows 7と互換性があります)。このプログラムは魅力的でした。
フェニックス

1
以下にuser36580が書いたように、「コマンドラインから直接実行している可能性が高い。その場合、ダブル%%をシングル%に変更する」
Lachlan McD。

1
削除されたものをプレビューできるので、純粋なコマンドラインバージョンよりもこれが好きです。を使用して、コマンドラインからいつでも呼び出すことができ"%~dp0\EmptyFolderNuker.exe" %cd%ます。
Jeroen Wiert Pluimers

1
@ rob-kam「EmptyFolderNuker」のURLは使用できなくなりました。
PeterCo

@PeterCoありがとう、現在修正済み。
ロブ・カム

0

Cygwinがインストールされている場合、これを行うことができます。

find -type d -exec rmdir {} \;

4
必ずしも。空のサブディレクトリのみがあるディレクトリは削除されない場合があります。あなたはそれを逆にする必要があるかもしれません。find -type d -print0 | tac | xargs -0 rmdir
ライアントンプソン

以前「tac」については知りませんでした。それは本当に素晴らしいです!
アンソニージョルジオ

1
またはを使用します。このオプションは、出力の順序を逆にするなどのことを行うように指示します。最初に最も深いディレクトリレベルに移動し、その後、元に戻ります。find (starting-directory) -depth -type d ...-depthfind
Gマン

0

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

...これをemacsで実現するために、これらすべてを入力する必要はないことを教えてください。
ハシム

1
@Hashimこれは、initで定義してからキーにバインドするという考え方です。技術的には、必要にD応じてバインドすることもできますが、これに対する一般的な必要性はないため、入力する必要があるのはM-x *ded RETバム完了です。(毎回実際にこれを入力する必要があった場合、それはばかげていることは絶対に正しいです-幸運にもそうではありません。)
ショーン・オールレッド

結構なことです、それはもっともらしい。
ハシム

M-x *ded RETどんな意味を持っているか、それがランダムでありますか?後者の場合、割り当てたすべてのショートカットをどのように追跡しemacsますか?暗記で十分ですか、それとも調べなければならないのですか?
ハシム

1
@Hashim *dedは完全な関数名の略語です*-delete-empty-directories。多くの補完エンジン(私が使用しているivyなど)は、この種のあいまい一致を理解しています。それらを記憶しておくことに関しては…単にする必要はありません。定義した関数はすべて開始されている*ため、キーにバインドされていない場合は簡単に見つけることができます。それ以外の場合、emacs自体は、関数を呼び出すより速い方法があったかどうかを教えてくれます。他のすべてが失敗した場合、常にありaproposます。
ショーンオールレッド

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

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

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

空のフォルダーを削除するフォルダーからこれを開始します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.