Сценарій нижче буде виконаний точно так, як ви описали:
- перераховує папки всередині каталогу
Шукає всередині кожної з папок папку під назвою "Запис"
- Якщо він існує і порожній, він видаляє свою вищу папку
- якщо його не існує, він також видаляє свою верхню папку
- Файли першого рівня всередині 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
або якщо папка "Запис" взагалі не існує:
FileNotFoundError
shutil.rmtree(path(dr,d))
Якщо папка "Запис" існує і порожня, вища версія папки видаляється:
if not os.listdir(path(dr, d, "Recording")):
shutil.rmtree(path(dr,d))
EDIT
Додатково, як вимагається в коментарях, версія, яка перевірятиме наявність кількох підкаталогів (імен).
Якщо каталог містить будь-який із перелічених (не порожніх) підкаталогів, каталог зберігається. В іншому випадку це буде видалено.
Використовувати
- Скопіюйте скрипт у порожній файл, збережіть його як
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))
Примітка
Спочатку запустіть тестовий каталог, щоб переконатися, що він робить саме те, що ви хочете.