Windows で空のディレクトリを再帰的に削除
私のWindows 7のマシンには、数百、数千ではないにしても数百のサブディレクトリがあるディレクトリがあります。その中にはファイルを持っているものもあれば、持っていないものもあります。空のディレクトリをすべて削除したい。
DOSコマンドのdelとrmdirを見ていると、すべてのファイルを削除せずに再帰的にこれを行うことができるようには見えません。コマンドラインからできる方法はありますか?
私のWindows 7のマシンには、数百、数千ではないにしても数百のサブディレクトリがあるディレクトリがあります。その中にはファイルを持っているものもあれば、持っていないものもあります。空のディレクトリをすべて削除したい。
DOSコマンドのdelとrmdirを見ていると、すべてのファイルを削除せずに再帰的にこれを行うことができるようには見えません。コマンドラインからできる方法はありますか?
空のディレクトリの削除](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
がファイルを含むディレクトリを削除しないために機能します。
ROBOCOPYも使えます。非常にシンプルで、大きな階層内の空フォルダの削除にも使えます。
ROBOCOPY folder1 folder1 /S /MOVE
ここでは、他のファイルを別のフォルダに移動するのではなく、空のフォルダを削除するだけなので、コピー元とコピー先の両方がfolder1
になります。/S
オプションは、空のフォルダのコピー(移動)をスキップします。また、同じドライブ内でファイルが移動されるので、より高速になります。
フリーのユーティリティ EmptyFolderNuker は、お好みのベースフォルダからこれを実行します。また、空のサブディレクトリだけを含むディレクトリも削除します。
前の回答ではどれもうまくいかなかったので、以下のファイルを作ってみました。
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
空でないディレクトリに対して警告が表示されます。
通常の免責事項。自己責任で使用してください。テスト前にバックアップを取ってください。
Cygwin](http://www.cygwin.com/)がインストールされている場合は、このようにすることができます。
find -type d -exec rmdir {} \;
うーん…もっとシンプルな解決策があるかもしれません。
for /d /r %d in (*.*) do rd "%d"
空のフォルダを削除したいフォルダから起動します。
/d - ファイルではなくフォルダに対して動作します。
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 フラグを省略してください。
4NTシェル(最近ではTake Command)には、/sxオプションで「DEL」があります。/sは再帰的で、付加されたxは空のdirを削除します。
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)))))