Ich muss leere Verzeichnisse für eine bestimmte Liste von Verzeichnissen finden. Einige Verzeichnisse enthalten Verzeichnisse.
Wenn interne Verzeichnisse ebenfalls leer sind, kann ich sagen, dass das Hauptverzeichnis leer ist, andernfalls ist es nicht leer.
Wie kann ich das testen?
Beispielsweise:
A>A1(file1),A2 this is not empty beacuse of file1
B>B1(no file) this is empty
C>C1,C2 this is empty
Antworten:
Überprüfen Sie, ob
find <dir> -type f
etwas ausgegeben wird. Hier ist ein Beispiel:quelle
-type f
.mkdir A B C A/A1 A/A2 B/B1 C/C1 C/C2; touch A/A1/file1
- und den Code in meiner Antwort ausführe, wird gemeldet , dass B und C leer sind, wie vom OP gefordert. Sie müssen also etwas genauer sein als "es wird nicht funktionieren".Es hängt ein wenig davon ab, was Sie mit den leeren Verzeichnissen machen möchten. Ich benutze den folgenden Befehl, wenn ich alle leeren Verzeichnisse innerhalb eines Baums löschen möchte , z
test
. B. Verzeichnis.Bei dem obigen Befehl ist zu beachten, dass auch leere Dateien entfernt werden. Verwenden Sie daher die Option -type d , um dies zu vermeiden.
Löschen
-delete
, um die übereinstimmenden Dateien und Verzeichnisse anzuzeigen.Wenn Sie einen leeren Verzeichnisbaum so definieren, dass er keine Dateien enthält, können Sie etwas zusammenfügen, je nachdem, ob
find test -type f
etwas zurückgegeben wird.find
ist ein großartiges Dienstprogramm und RTFM früh und oft, um wirklich zu verstehen, wie viel es kann :-)quelle
-empty
, so bequem!find test -name ".DS_Store" -delete
zuerst den-empty delete
Befehl und dann den Befehl aus. Beachten Sie auch, wiepushd
im übergeordneten Verzeichnis, so dassfind test
wirdfind .
, aber der Rest der Befehle sind die gleichen.-depth
hier hinzufügen , dh Ursache finden, um eine Tiefenüberquerung durchzuführen, dh Verzeichnisse werden in Nachbestellung besucht und alle Einträge in einem Verzeichnis werden vor dem Verzeichnis selbst bearbeitet. Ich denke, dass es hier relevant ist.Sie können den folgenden Befehl verwenden:
quelle
Dies ist die Version, die ich am interessantesten fand. Wenn es aus dem internen Verzeichnis ausgeführt wird , werden alle leeren Verzeichnisse unten gelöscht (ein Verzeichnis wird als leer betrachtet, wenn es nur leere Verzeichnisse enthält).
Die Option mindepth verhindert, dass das Verzeichnis selbst gelöscht wird, wenn es leer ist.
quelle
rmdir --ignore-fail-on-non-empty -p directory
, um auch die Eltern loszuwerden.find . -type d -empty
Findet und listet leere Verzeichnisse und Unterverzeichnisse im aktuellen Baum auf. ZB resultierende Liste von leeren Verzeichnissen und Unterverzeichnissen:
Für die Verzeichnisse wird keine Operation ausgeführt. Sie werden einfach aufgelistet. Das funktioniert bei mir.
quelle
Finde einfach leere Verzeichnisse
Um nur leere Verzeichnisse zu finden (wie im Fragentitel angegeben), ist die Antwort des Mosg richtig:
Ist jedoch
-empty
möglicherweise bei sehr altenfind
Versionen nicht verfügbar (dies ist beispielsweise bei HP-UX der Fall ). Wenn dies der Fall ist, lesen Sie die im folgenden Abschnitt beschriebenen Techniken. Ist ein Verzeichnis leer? .Leere Verzeichnisse löschen
Das ist etwas schwierig: Angenommen, ein Verzeichnis
MyDir
enthält leere Verzeichnisse. Nach dem Entfernen dieser leeren VerzeichnisseMyDir
wird ein leeres Verzeichnis und sollte auch entfernt werden. Daher verwende ich den Befehlrmdir
mit der Option--parents
(oder-p
), die nach Möglichkeit auch übergeordnete Verzeichnisse entfernt:In älteren
find
Versionen wird die Anweisung+
noch nicht unterstützt, daher können Sie;
stattdessen Folgendes verwenden :Ist ein Verzeichnis leer?
In den meisten dieser Antworten wird erläutert, wie überprüft wird, ob ein Verzeichnis leer ist. Deshalb stelle ich hier die drei verschiedenen Techniken zur Verfügung, die ich kenne:
[ $(find your/dir -prune -empty) = your/dir ]
eine Variation:
Erläuterung:
find -prune
ist ähnlich wiefind -maxdepth 0
mit weniger Zeichenfind -type d
druckt nur Verzeichnissefind -empty
druckt die leeren Verzeichnisse und Dateien(( ${#files} ))
Dieser Trick ist 100%
bash
, ruft aber eine Sub-Shell auf (erzeugt sie). Die Idee stammt von Bruno De Fraine und wurde von teambob verbessert den Kommentar . Ich rate diesem, wenn Sie verwendenBash und wenn Ihr Skript nicht portabel sein muss.Hinweis: Kein Unterschied zwischen einem leeren und einem nicht vorhandenen Verzeichnis (und selbst wenn der angegebene Pfad eine Datei ist).
[ $(ls -A your/dir) ]
Dieser Trick ist inspiriert von dem Artikel von nixCraft aus dem Jahr 2007. Andrew Taylor antwortete 2008 und gr8can8dian 2011.
oder die einzeilige Bashism-Version:
Hinweis:
ls
Gibt zurück,$?=2
wenn das Verzeichnis nicht vorhanden ist. Aber kein Unterschied zwischen einer Datei und einem leeren Verzeichnis.quelle
rmdir -vp
hat mir sehr geholfen, da ich nicht nur alle leeren Verzeichnisse unter einem Stamm löschen musste, sondern nach dem Löschen einer Datei nach leeren Verzeichnissen und übergeordneten Verzeichnissen suchen musste. In meiner Situation sind leere Verzeichnisse in Ordnung, solange sie nicht im Baum enthalten sind, aus dem ich gerade eine Datei entferne. Vielen Dank!Diese rekursive Funktion scheint den Trick zu tun:
Angesichts dieses Beispiels Verzeichnisstruktur:
Das Ergebnis der Ausführung dieser Funktion wäre:
was fehlt
/dir4/dirD
. Wenn Sie den rekursiven Aufruffindempty "$dir"
nach dem verschiebenfi
, nimmt die Funktion dieses Verzeichnis in ihre Ergebnisse auf.quelle
Wie wäre es mit
rmdir *
? Dieser Befehl schlägt in nicht leeren Verzeichnissen fehl.quelle
rmdir */*/* */* *
Obwohl dies keine 'Punktdateien' behandelt, erwarten Sie in manuellen Situationen (Bereinigen von Datendateien) im Allgemeinen keine 'Punktdateien'. Die rekursiven Methoden dienen jedoch einer automatisierteren allgemeinen Bereinigung, insbesondere in sehr großen Verzeichnisstrukturen.Der folgende Befehl gibt 1 zurück, wenn ein Verzeichnis leer ist (oder nicht existiert) und andernfalls 0 (damit der Rückkehrcode
!
in einem Shell-Skript invertiert werden kann ):quelle
Ich habe eine einfache Struktur wie folgt erstellt:
Das
test/test3/file
enthält Junk-Text.Die Ausgabe
find test -empty
gibt "test/test2/test2.2
" als einziges leeres Verzeichnis zurück.quelle
Ein einfacher Ansatz wäre:
ebenfalls,
quelle
quelle