特定のサブディレクトリにファイルを含むすべてのディレクトリを保持する必要がありますが、サブディレクトリが空である残りのすべてのディレクトリを削除する必要があります。
具体的には、構造は次のとおりです。
A || -------- 312311 | || |----録音| | ---- a.txt | | ---- b.txt ||| -------- 453453 | |----録音| || | ------- a.mp3 | | ---- a.txt | | ---- b.txt ||| -------- 566532 | |----録音| | ---- a.txt | | ---- b.txt
サブディレクトリにはファイルが含まれる場合と含まれない場合があります。したがって、「312311」や「566532」などのディレクトリ全体を削除する必要があります。「Recording」フォルダに特定のディレクトリであるファイルがあるため、「453453」だけにすべてのデータを残しておく必要があります。
>私は多くの投稿を見ましたが、それは多くの特定のファイル名にリンクしています。週に何度もやらなければならないので、どんな助けでも大歓迎です。
承認された回答:
以下のスクリプトは、あなたが説明したとおりに機能します。
- ディレクトリ内のフォルダを一覧表示します
-
各フォルダ内で「Recording」という名前のフォルダを探します
- 存在する場合および 空の場合、上位フォルダーを削除します
- そうでない場合 存在する場合は、上位フォルダーも削除します
- ファイル A内の最初のレベルは削除されません。
画像内:
A || -------- 123456 | || |----録音| | ---- a.txt | | ---- b.txt ||| -------- 635623 | |----録音| || | ------- a.mp3 | | ---- a.txt | | ---- b.txt ||| -------- 123456 | |----録音| | ---- a.txt | | ---- b.txt || -------- Monkey.txt
結果は次のようになります:
A ||| -------- 635623 | |----録音| || | ------- a.mp3 | | ---- a.txt | | ---- b.txt ||| -------- Monkey.txt
スクリプト
#!/ usr / bin / env python3import osimport sysimport shutildr =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:パス
使用する
- スクリプトを空のファイルにコピーし、
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"))
各(サブ)フォルダのコンテンツを一覧表示しようとします。これにより、アイテムがファイルの場合にエラーが発生します。
NotADirectoryErrorパスを除く
または、フォルダ「Recording」がまったく存在しない場合:
FileNotFoundError shutil.rmtree(path(dr、d))
フォルダ「Recording」が存在する場合および 空の場合、上位フォルダが削除されます:
if not os.listdir(path(dr、d、 "Recording")):shutil.rmtree(path(dr、d))
編集
さらに、コメントで要求されているように、複数のサブディレクトリ(名前)をチェックするバージョン。
ディレクトリにanyが含まれている場合 リストされた(空でない)サブディレクトリのうち、ディレクトリが保持されます。それ以外の場合は削除されます。
使用する
- スクリプトを空のファイルにコピーし、
delete_empty.py
として保存します -
(full!)ディレクトリ(サブディレクトリ、例ではAを含む)とサブディレクトリの名前を引数としてコマンドで実行します:
python3 /path/to/delete_empty.py / path / to / directory
それだけです。
関連:「sudoecho nameserver 8.8.8.8> /etc/resolv.conf」は何をしますか?スクリプト
#!/ usr / bin / env python3import shutilimport osimport sysdr =sys.argv [1]; matchs =sys.argv [2:] def path(* args):return os.path.join(* args)for d in os.listdir(dr):#リストされたサブディレクトリのいずれかにファイルがない限り、ディレクトリを削除しますkeep =False#リストされた各サブディレクトリ(名前)の名前が一致するかどうかを確認します:try:if os.listdir(path(dr、d、name)):keep =True break(NotADirectoryErrorを除く):#アイテムがdir、他の名前をチェックするために使用しないkeep =True breakただしFileNotFoundErrorを除く:#名前(subdir)が存在しない場合は、次のパスをチェックします。保持しない場合:#保持する理由がない場合->shutilを削除します。 rmtree(path(dr、d))
注
最初にテストディレクトリで実行して、希望どおりに動作することを確認してください。