web-dev-qa-db-ja.com

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

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

58
justingrif

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

find . -empty -type d -delete

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

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

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

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

118
Bill

rmdirコマンドの拒否を利用して空でないディレクトリを削除し、find -depthオプションを使用してディレクトリツリーをボトムアップで走査できます。

find . -depth -exec rmdir {} \;  

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

find-depthオプションは、ディレクトリツリーの一番下から検索を開始します。

rm -rfは、ディレクトリ(およびそのサブディレクトリなど)のすべてのfilesと、すべてのディレクトリおよびすべてを削除します。

11
waltinator
rmdir *

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

rmdir * 2> /dev/null
8
evilsoup
find . -type d -empty -delete -maxdepth 1

foo/の直接のサブディレクトリのみを削除する場合。

1
Simon Baars

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()は、emptyリスト内の各アイテムに対してos.rmdir()を実行するために使用されます。リストの内包表記も代替として使用できます。

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

#!/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)
0