Musím ponechat všechny adresáře, které obsahují soubory v konkrétním podadresáři, ale smazat všechny ostatní adresáře, ve kterých je podadresář prázdný.
Abych byl konkrétnější, zde je struktura:
A||--------312311| || |----Nahrávání| |----a.txt| |----b.txt|||--------453453| |----Nahrávání| || |-------a.mp3| |----a.txt| |----b.txt|||--------566532| |----Nahrávání| |----a.txt| |----b.txt
Podadresáře mohou nebo nemusí obsahovat soubor. Potřebuji tedy smazat celý adresář jako '312311' &'566532' a pouze '453453' by měl zůstat se všemi daty v něm, protože má soubor ve složce 'Recording', což je pro mě specifický adresář.
Viděl jsem mnoho příspěvků, ale odkazuje na mnoho konkrétních názvů souborů. Jakákoli pomoc bude velmi oceněna, protože to musím udělat mnohokrát za týden.
Přijatá odpověď:
Níže uvedený skript bude fungovat přesně tak, jak popisujete, tedy:
- uvádí seznam složek v adresáři
-
Hledá uvnitř každé složky složku s názvem „Nahrávání“
- Pokud existuje a je prázdná, smaže svou nadřazenou složku
- pokud není existovat, odstraní také svou nadřazenou složku
- soubory na první úrovni uvnitř A nebudou smazány.
Na obrázku:
A||--------123456| || |----Nahrávání| |----a.txt| |----b.txt|||--------635623| |----Nahrávání| || |-------a.mp3| |----a.txt| |----b.txt|||--------123456| |----Nahrávání| |----a.txt| |----b.txt||--------Monkey.txt
výsledkem bude:
A|||--------635623| |----Nahrávání| || |-------a.mp3| |----a.txt| |----b.txt|||--------Monkey.txt
Skript
#!/usr/bin/env python3import osimport sysimport shutildr =sys.argv[1]def cesta(*args):return os.path.join(*args)for d v os.listdir(dr ):zkuste:pokud ne os.listdir(cesta(dr, d, "Záznam")):shutil.rmtree(cesta(dr,d)) kromě FileNotFoundError:shutil.rmtree(cesta(dr,d)) kromě NotADirectoryError:pass
K použití
- Zkopírujte skript do prázdného souboru a uložte jej jako
delete_empty.py
-
Spusťte jej s (plným!) adresářem (obsahujícím vaše podadresáře, ve vašem příkladu A) jako argument příkazem:
python3 /path/to/delete_empty.py /path/to/directory
To je ono.
Vysvětlení
Vložení obsahu vaší složky „A“ do skriptu,
os.listdir(dr)
zobrazí jeho podadresáře (a soubory). Potom:
pokud ne os.listdir(cesta(dr, d, "Nahrávání"))
se pokusí vypsat obsah každé z (pod)složek, což vyvolá chybu, pokud je položkou soubor:
kromě NotADirectoryError pass
nebo pokud složka „Nahrávání“ vůbec neexistuje:
FileNotFoundError shutil.rmtree(cesta(dr,d))
Pokud složka „Nahrávání“ existuje a je prázdná, nadřazená složka je odstraněna:
pokud ne os.listdir(cesta(dr, d, "Záznam")):Shutil.rmtree(cesta(dr,d))
UPRAVIT
Navíc, jak je požadováno v komentářích, verze, která bude kontrolovat více podadresářů (jmén).
V případě, že adresář obsahuje any z uvedených (neprázdných) podadresářů je adresář zachován. Jinak bude smazán.
K použití
- Zkopírujte skript do prázdného souboru a uložte jej jako
delete_empty.py
-
Spusťte jej s (úplným!) adresářem (obsahujícím vaše podadresáře, ve vašem příkladu A) a názvy podadresářů jako argumenty příkazem:
python3 /path/to/delete_empty.py /path/to/directory
To je ono.
Související:Co dělá „sudo echo nameserver 8.8.8.8> /etc/resolv.conf“?Skript
#!/usr/bin/env python3import shutilimport osimport sysdr =sys.argv[1]; odpovídá =sys.argv[2:]def cesta(*args):return os.path.join(*args)for d v os.listdir(dr):# odstranit adresář *pokud* jeden z uvedených podadresářů nemá soubory keep =False # kontrola pro každý z uvedených podadresářů (názvů) na jméno ve shodě:try:if os.listdir(path(dr, d, name)):keep =True break kromě NotADirectoryError:# pokud položka není dir, jiné názvy ke kontrole nepoužívat keep =True break kromě FileNotFoundError:# pokud název (podadresář) neexistuje, zkontrolujte další průchod, pokud ne keep:# pokud není důvod ponechat --> smazat Shutil. rmtree(cesta(dr,d))
Poznámka
Nejprve spusťte testovací adresář, abyste se ujistili, že dělá přesně to, co chcete.