GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Das übergeordnete Verzeichnis (nicht leer) löschen, wenn ein bestimmtes untergeordnetes Verzeichnis leer ist?

Ich muss alle Verzeichnisse behalten, die Dateien in einem bestimmten Unterverzeichnis enthalten, aber um alle Verzeichnisse zu löschen, in denen das Unterverzeichnis leer ist.

Genauer gesagt hier die Struktur:

A||--------312311| || |----Aufnahme| |----a.txt| |----b.txt|||--------453453| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------566532| |----Aufnahme| |----a.txt| |----b.txt 

Die Unterverzeichnisse können eine Datei enthalten oder nicht. Also muss ich das gesamte Verzeichnis wie „312311“ und „566532“ löschen, und nur „453453“ sollte mit allen Daten darin verbleiben, da es eine Datei im Ordner „Recording“ gibt, was ein spezielles Verzeichnis für mich ist.

Ich habe viele Beiträge gesehen, aber es enthält Links zu vielen bestimmten Dateinamen. Jede Hilfe wird sehr geschätzt, da ich viele Male in einer Woche tun muss.

Akzeptierte Antwort:

Das folgende Skript wird genau das tun, was Sie beschreiben, es:

  1. listet die Ordner innerhalb eines Verzeichnisses auf
  2. Sucht in jedem der Ordner nach einem Ordner mit dem Namen „Aufnahme“

    • Wenn es existiert und leer ist, löscht es seinen übergeordneten Ordner
    • falls doch nicht existieren, löscht es auch seinen übergeordneten Ordner
    • Dateien auf der ersten Ebene innerhalb von A werden nicht gelöscht.

In einem Bild:

A||--------123456| || |----Aufnahme| |----a.txt| |----b.txt|||--------635623| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------123456| |----Aufnahme| |----a.txt| |----b.txt||--------Monkey.txt 

ergibt:

A|||--------635623| |----Aufnahme| || |-------a.mp3| |----a.txt| |----b.txt|||--------Monkey.txt 

Das Skript

#!/usr/bin/env python3import osimport sysimport shutdownildr =sys.argv[1]def path(*args):gebe os.path.join(*args)für d in os.listdir(dr ):try:wenn nicht os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d)) außer FileNotFoundError:shutdown.rmtree(path(dr,d)) außer NotADirectoryError:passieren 

Zu verwenden

  1. Kopieren Sie das Skript in eine leere Datei und speichern Sie es als delete_empty.py
  2. Führen Sie es mit dem (vollständigen!) Verzeichnis (enthält Ihre Unterverzeichnisse, A in Ihrem Beispiel) als Argument durch den Befehl:

    aus
    python3 /path/to/delete_empty.py /path/to/directory 

Das ist es.

Erklärung

Den Inhalt Ihres Ordners „A“ in das Skript einspeisen,

os.listdir(dr) 

listet seine Unterverzeichnisse (und Dateien) auf. Dann:

wenn nicht os.listdir(path(dr, d, "Recording")) 

versucht, den Inhalt jedes (Unter-)Ordners aufzulisten, was einen Fehler auslöst, wenn es sich bei dem Element um eine Datei handelt:

außer NotADirectoryError pass 

oder falls der Ordner „Aufnahme“ gar nicht existiert:

FileNotFoundError shutdown.rmtree(path(dr,d)) 

Wenn der Ordner „Aufnahme“ existiert und leer ist, wird der übergeordnete Ordner entfernt:

wenn nicht os.listdir(path(dr, d, "Recording")):shutdown.rmtree(path(dr,d)) 

BEARBEITEN

Zusätzlich, wie in den Kommentaren gefordert, eine Version, die nach mehreren Unterverzeichnissen (Namen) sucht.

Falls das Verzeichnis beliebige enthält von den aufgelisteten (nicht leeren) Unterverzeichnissen wird das Verzeichnis beibehalten. Andernfalls wird es gelöscht.

Zu verwenden

  1. Kopieren Sie das Skript in eine leere Datei und speichern Sie es als delete_empty.py
  2. Führen Sie es mit dem (vollständigen!) Verzeichnis (das Ihre Unterverzeichnisse enthält, A in Ihrem Beispiel) und den Namen der Unterverzeichnisse als Argumente durch den Befehl:

    aus
    python3 /path/to/delete_empty.py /path/to/directory    

Das ist es.

Verwandte:Was macht „sudo echo nameserver 8.8.8.8> /etc/resolv.conf“?

Das Skript

#!/usr/bin/env python3import shutdownilimport osimport sysdr =sys.argv[1]; matchs =sys.argv[2:]def path(*args):gebe os.path.join(*args)for d in os.listdir(dr) zurück:# Verzeichnis löschen *es sei denn* eines der aufgelisteten Unterverzeichnisse hat Dateien keep =False # für jedes der aufgelisteten Unterverzeichnisse (Namen) auf Namen in Übereinstimmungen prüfen:try:if os.listdir(path(dr, d, name)):keep =True break except NotADirectoryError:# if the item not a dir, keine Verwendung für andere Namen zum Prüfen keep =True break außer FileNotFoundError:# wenn der Name (subdir) nicht existiert, beim nächsten Durchlauf prüfen if not keep:# wenn es keinen Grund zum Beibehalten gibt --> Shutil löschen. rmtree(path(dr,d)) 

Hinweis

Bitte führen Sie zuerst ein Testverzeichnis aus, um sicherzustellen, dass es genau das tut, was Sie wollen.


Ubuntu
  1. Löschen Sie ein Verzeichnis in Ubuntu 20.04 - Beste Methoden

  2. Löscht „rm .*“ jemals das übergeordnete Verzeichnis?

  3. Warum ist die PGID der untergeordneten Prozesse nicht die PGID des übergeordneten Prozesses?

  4. Wie lösche ich alle Dateien außer einer benannten Datei aus einem bestimmten Ordner?

  5. Wie verschiebt man das MySQL-Datenverzeichnis?

So erhalten Sie die Größe eines Verzeichnisses in Linux

Der Linux-Befehl pwd

So löschen Sie ein Verzeichnis in Ubuntu 20.04

Verzeichnis in Linux entfernen – So löschen Sie einen Ordner von der Befehlszeile aus

So löschen Sie Dateien und Verzeichnisse mit dem Terminal in Debian 10

Wie listet man die Verzeichnisgröße aller untergeordneten Verzeichnisse auf?