私のWindows 7マシンには、数千ではないにしても数百のサブディレクトリがあるディレクトリがあります。ファイルのあるものとないものがあります。空のディレクトリをすべて削除したい。
delおよびrmdir DOSコマンドを見ると、すべてのファイルを削除せずに再帰的に実行できるようには見えません。コマンドラインからこれを行う方法はありますか?
xcopy FROMDIR TODIR /s
。:これはSOお答えくださいstackoverflow.com/a/14742810
私のWindows 7マシンには、数千ではないにしても数百のサブディレクトリがあるディレクトリがあります。ファイルのあるものとないものがあります。空のディレクトリをすべて削除したい。
delおよびrmdir DOSコマンドを見ると、すべてのファイルを削除せずに再帰的に実行できるようには見えません。コマンドラインからこれを行う方法はありますか?
xcopy FROMDIR TODIR /s
。:これはSOお答えくださいstackoverflow.com/a/14742810
回答:
空のディレクトリの削除ユーティリティを使用できます。
または、次のワンライナーバッチファイル(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
オプションは、空のフォルダーのコピー(上記の場合は移動)をスキップすることです。また、ファイルが同じドライブ内で移動されるため、高速です。
folder1
か?よくテストしない限り、怖い。
/MOVE
最初にファイルをコピーし、コピー後にソースファイルを削除します。したがって、/S
使用されているように、空ではないフォルダーを宛先(上記の場合は同じフォルダー)にコピーします。次に、空のフォルダーを削除します(空のフォルダーは既にコピーされていると考えるなど)。いいえ、ROBOCOPYはフォルダーを再帰的に移動するため、ネストされたフォルダーをに移動しませんfolder1
。
CygwinにはGNU findが付属しているため、これを行うことができます。
find . -type d -empty -delete
または、フォルダーが存在しなくなったときのノイズを回避するには:
find . -type d -empty -execdir rmdir {} +
find . -type d -empty -delete
:)次のエラーでコマンド・プロンプトから、失敗したFIND: Parameter format not correct
無料のユーティリティEmptyFolderNukerは、選択したベースフォルダーからこれを実行します。また、空のサブディレクトリのみを含むディレクトリも削除します。
"%~dp0\EmptyFolderNuker.exe" %cd%
ます。
Cygwinがインストールされている場合、これを行うことができます。
find -type d -exec rmdir {} \;
find
(starting-directory)
-depth
-type d ...
-depth
find
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)))))
D
応じてバインドすることもできますが、これに対する一般的な必要性はないため、入力する必要があるのはM-x *ded RET
バム完了です。(毎回実際にこれを入力する必要があった場合、それはばかげていることは絶対に正しいです-幸運にもそうではありません。)
M-x *ded RET
どんな意味を持っているか、それがランダムでありますか?後者の場合、割り当てたすべてのショートカットをどのように追跡しemacs
ますか?暗記で十分ですか、それとも調べなければならないのですか?
*ded
は完全な関数名の略語です*-delete-empty-directories
。多くの補完エンジン(私が使用しているivyなど)は、この種のあいまい一致を理解しています。それらを記憶しておくことに関しては…単にする必要はありません。定義した関数はすべて開始されている*
ため、キーにバインドされていない場合は簡単に見つけることができます。それ以外の場合、emacs自体は、関数を呼び出すより速い方法があったかどうかを教えてくれます。他のすべてが失敗した場合、常にありapropos
ます。
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」冗長フラグを省略します。
うーん...多分もっと簡単な解決策:
for /d /r %d in (*.*) do rd "%d"
空のフォルダーを削除するフォルダーからこれを開始します。
/ d-ファイルではなくフォルダで動作します/ r-サブディレクトリを再帰します