以下のスクリプトは、説明したとおりに実行します。
- ディレクトリ内のフォルダをリストします
「Recording」という名前のフォルダーを各フォルダー内で探します
- 存在し、空の場合、その上位フォルダーを削除します
- 存在しない場合は、上位フォルダーも削除します
- A内の最初のレベルのファイルは削除されません。
画像内:
A
|
|--------123456
| |
| |----Recording
| |----a.txt
| |----b.txt
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------123456
| |----Recording
| |----a.txt
| |----b.txt
|
|--------Monkey.txt
結果として:
A
|
|
|--------635623
| |----Recording
| |
| |-------a.mp3
| |----a.txt
| |----b.txt
|
|
|--------Monkey.txt
スクリプト
#!/usr/bin/env python3
import os
import sys
import shutil
dr = sys.argv[1]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
try:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
except FileNotFoundError:
shutil.rmtree(path(dr,d))
except NotADirectoryError:
pass
使用するには
- スクリプトを空のファイルにコピーして、名前を付けて保存します
delete_empty.py
(full!)ディレクトリ(サブディレクトリを含む、例ではA)をコマンドの引数として実行します。
python3 /path/to/delete_empty.py /path/to/directory
それでおしまい。
説明
フォルダ「A」のコンテンツをスクリプトにフィードし、
os.listdir(dr)
そのサブディレクトリ(およびファイル)をリストします。次に:
if not os.listdir(path(dr, d, "Recording"))
各(サブ)フォルダーのコンテンツをリストしようとしますが、アイテムがファイルの場合はエラーが発生します。
except NotADirectoryError
pass
または、フォルダ「Recording」がまったく存在しない場合:
FileNotFoundError
shutil.rmtree(path(dr,d))
フォルダ「Recording」が存在し、空の場合、上位のフォルダは削除されます:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
編集
さらに、コメントで要求されているように、複数のサブディレクトリ(名前)をチェックするバージョン。
場合にディレクトリが含まれて任意の列挙された(未空の)サブディレクトリのディレクトリが保持されています。それ以外の場合は削除されます。
使用するには
- スクリプトを空のファイルにコピーして、名前を付けて保存します
delete_empty.py
(full!)ディレクトリ(サブディレクトリ、例ではAを含む)と、コマンドによる引数としてサブディレクトリの名前を指定して実行します。
python3 /path/to/delete_empty.py /path/to/directory <subdir1> <subdir2> <subdir3>
それでおしまい。
スクリプト
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]; matches = sys.argv[2:]
def path(*args):
return os.path.join(*args)
for d in os.listdir(dr):
# delete directory *unless* either one of the listed subdirs has files
keep = False
# check for each of the listed subdirs(names)
for name in matches:
try:
if os.listdir(path(dr, d, name)):
keep = True
break
except NotADirectoryError:
# if the item is not a dir, no use for other names to check
keep = True
break
except FileNotFoundError:
# if the name (subdir) does not exist, check for the next
pass
if not keep:
# if there is no reason to keep --> delete
shutil.rmtree(path(dr,d))
注意
最初にテストディレクトリで実行して、希望どおりに動作することを確認してください。