コマンドラインからディレクトリ内のすべての空のディレクトリを削除するにはどうすればよいですか?


58

という名前のディレクトリがあるとしfoo/ます。このフォルダにはサブディレクトリが含まれます。1つのコマンドですべての空のディレクトリを削除するにはどうすればよいですか?

回答:


119

このコマンドを試してください:

find . -empty -type d -delete

このfindコマンドは、指定されたパス、この場合は現在のディレクトリ(したがって.)から特定の検索条件に一致するファイル/ディレクトリを検索するために使用されます。

この-emptyオプションは、空のすべてのファイルとディレクトリに当てはまります。

この-type dオプションは、指定されたファイルの種類に当てはまります。この場合d、ファイルタイプディレクトリを表します。

この-deleteオプションは実行するアクションであり、検索で見つかったすべてのファイルに当てはまります。


これが最も簡単な方法だと思うので、先に進み、回答済みとしてマークします。
justingrif

ちょっとビル、私は別の似たような質問を投稿しようとしました。上記と同じことをしたかったが、空かどうかに関係なくすべてのディレクトリを削除したとしましょう。
justingrif

3
ディレクトリが空かどうかに関係なく、ディレクトリを削除する方法は、次のコマンドを入力しますrm -rf <directory-name>。これにより、ファイルとサブディレクトリを含むすべてのコンテンツとともにディレクトリが削除されます。-r一方、オプションは、再帰的に削除を意味-f指令手段は、削除する前にプロンプトを表示しません。ただし、ディレクトリ/ファイルを削除する前にプロンプ​​トを表示する-f場合は、-iオプションをオプションに置き換えます。
ビル

上記のディレクトリにいくつかのファイルがあった場合はどうすればいいですか。そのため、/ foo / bar /内のすべてのディレクトリを削除したいが、そこにある可能性のあるファイルはすべて保持したかった。
justingrif

2
パイプを使用してstdout1つのコマンド(例find)をstdin他のコマンド(例)にフィードすることでこれを行うことができrmますが、不要なファイル/ディレクトリを消去または削除する可能性があるため、非常に注意してください削除!これを行う方法の詳細についてはman、これらの各コマンドのページを参照してください。安全のために、実際のことを試す前に、一時ディレクトリでそのようなことを常にテストしてください。
ビル

11

あなたはの利点を取ることができますrmdir非空のディレクトリを削除するコマンドの拒否、およびfind -depthオプションは、ディレクトリツリーのボトムアップを横断します:

find . -depth -exec rmdir {} \;  

(およびエラーを無視)、または2>/dev/null実際にそれらを無視するために追加します。

-depthオプションfindディレクトリツリーの最下部に見つけることが開始されます。

rm -rfディレクトリ(およびそのサブディレクトリ、...)内のすべてのファイルと、すべてのディレクトリおよびすべてを削除します。


8
rmdir *

すべての空のディレクトリを削除します。空ではないすべてのディレクトリとファイルに対してエラーをスローし、これらのエラーが端末を乱雑にするのを防ぐために、

rmdir * 2> /dev/null

これは、ゼロ以外のステータスコードで終了するため、スクリプトには適していませんが、機能します。
the_drow

@the_drowはど​​のように不適切になりますか?ちなみにを使用することもできますrmdir * 2>/dev/null || true。(スクリプトにはfind(1)の方法が適していますが、その他の理由:やりたいことをよりうまく表現するためです。)
アロイスマダル

私はよくこれをで行い$HOMEます。邪悪な笑顔で。
アロイスマーダル

いくつかのディレクトリが空でない場合、失敗を報告するためです。
the_drow

これはfindメソッドよりも高速ですか?誰も2つを比較しましたか?
ゼロス


0

Pythonのアプローチ

$ tree                                                                                                                                                                                  
.
├── empty_dir1
├── empty_dir2
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

4 directories, 4 files
$ python -c 'import os;empty=[r for r,s,f in os.walk(".") if not f and not s and r != "." ];map(lambda x: os.rmdir(x),empty)'
$ tree
.
├── subdir1
│   ├── file1.abc
│   └── file2.abc
└── subdir2
    ├── file1.abc
    └── file2.abc

これは次のように機能します。

  • os.walk()関数を使用して、ディレクトリツリーを再帰的にウォークします。各反復がでr私たちがアクセスしている現在のフォルダに設定されている、s内のディレクトリのリストが含まrれ、fそのフォルダ内のファイルのリストが含まれます。もちろん、fsが空の場合、空であることはわかりrます。
  • 最初のlist-comprehensionによりempty、上記の評価に基づいて、空のすべてのディレクトリのリストを作成できます。
  • 2番目の関数map()os.rmdir()emptyリスト内の各項目で実行するために使用されます。リストの内包表記も代替として使用できます。

スクリプトとして、これは次のようになります。

#!/usr/bin/env python
import os
empty=[]
for r,s,f in os.walk("."):
    if not f and not s and r != ".":
        empty.append(r)

for i in empty:
    os.rmdir(i)

単純な質問には複雑すぎます:(
nurulhudamustaqim

@nurulhudamustaqim視点に依存します。Pythonに慣れている多くのLinuxユーザーにとって、これは実際には非常に控えめです:)そして、その多様性に加えて。現代のシステム管理は、bashのに制限されたりされていない/bin/shだけとPythonは、実際には、これらの2以上のエレガントな言語である
Sergiy Kolodyazhnyy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.