GNU/Linux >> Znalost Linux >  >> Ubuntu

Smazat nadřazený adresář (neprázdný) Pokud je konkrétní podřízený adresář prázdný?

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:

  1. uvádí seznam složek v adresáři
  2. 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í

  1. Zkopírujte skript do prázdného souboru a uložte jej jako delete_empty.py
  2. 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í

  1. Zkopírujte skript do prázdného souboru a uložte jej jako delete_empty.py
  2. 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.


Ubuntu
  1. Smazat adresář v Ubuntu 20.04 - Nejlepší metody

  2. Proč není Pgid procesů dítěte PGID rodiče?

  3. Výchozí nastavení nových podřízených souborů a složek na vlastnictví nadřazené složky?

  1. Ssh do konkrétního adresáře?

  2. Jaký je nejbezpečnější způsob, jak vyprázdnit adresář v *nix?

  3. Jak mohu smazat nový řádek, pokud je to poslední znak v souboru?

  1. Smaže „rm .*“ někdy nadřazený adresář?

  2. Jak odstranit všechny soubory kromě jednoho pojmenovaného souboru z konkrétní složky?

  3. Jak nastavím pracovní adresář nadřazeného procesu?