foo/
という名前のディレクトリがあるとします。このフォルダにはサブディレクトリが含まれます。 1つのコマンドですべての空のディレクトリを削除するにはどうすればよいですか?
このコマンドを試してください:
find . -empty -type d -delete
find
コマンドは、指定されたパス(この場合は現在のディレクトリ)から特定の検索条件に一致するファイル/ディレクトリを検索するために使用されます(したがって.
)。
-empty
オプションは、空のすべてのファイルとディレクトリに当てはまります。
-type d
オプションは、指定されたfileタイプに対してtrueを保持します。この場合、d
はファイルタイプディレクトリを表します。
-delete
オプションは実行するアクションであり、検索で見つかったすべてのファイルに当てはまります。
rmdir
コマンドの拒否を利用して空でないディレクトリを削除し、find -depth
オプションを使用してディレクトリツリーをボトムアップで走査できます。
find . -depth -exec rmdir {} \;
(およびエラーを無視します)、または2>/dev/null
を追加して実際にそれらを無視します。
find
の-depth
オプションは、ディレクトリツリーの一番下から検索を開始します。
rm -rf
は、ディレクトリ(およびそのサブディレクトリなど)のすべてのfilesと、すべてのディレクトリおよびすべてを削除します。
rmdir *
すべての空のディレクトリを削除します。空ではないすべてのディレクトリとファイルに対してエラーをスローし、それらのエラーが端末を乱雑にするのを防ぐために、
rmdir * 2> /dev/null
find . -type d -empty -delete -maxdepth 1
foo/
の直接のサブディレクトリのみを削除する場合。
$ 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
にはそのフォルダー内のファイルのリストが含まれます。もちろん、f
とs
が空の場合、r
が空であることがわかります。empty
を作成できます。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)