Wie finde ich rekursiv Ordner auf einem Linux-System, das nur Ordner enthält?

597
Bob Ortiz

Ich versuche, einen Befehl zu finden, der rekursiv Verzeichnisse findet, die nur ein oder mehrere Verzeichnisse auf derselben Ebene enthalten. Vorzugsweise mit dem findBefehl. Wie find . -type d.

Zum Beispiel in der folgenden Dateistruktur:

/tmp/folder1/folder1a/test.jpg /tmp/folder1/file1a.tmp /tmp/folder2/folder2a/test.jpg /tmp/folder3/folder3a/ /tmp/folder3/folder3b/file.jpg 

Ich würde gerne weiter folder2und folder3nur da es keine Dateien selbst enthält, enthält es nur Ordner (mit Dateien).

0

2 Antworten auf die Frage

3
Andrew Domaszek

comm -23 <(find . -type d ! -empty | sort -u) <(find . -type f -printf '%h\n' | sort -u)

Dies ist eine Liste nicht leerer Ordner (mindestens eine Sache darin), ausgenommen derer, die Dateien enthalten. Wenn Sie auch Elemente wie Pipes und Symlinks ausschließen möchten, können Sie diese ! -type danstelle von verwenden -type f. Es kann nicht in einer einzelnen Suchanweisung ausgeführt werden, da find nicht mit komplexen Inhaltskriterien übereinstimmen kann (dies ist nicht XPath).

2
Kamil Maciorowski

Wenn ich dich recht verstehe, sollte dies Folgendes tun:

find . -type d ! -empty -exec sh -c '\ [ -z "`find "$1" -maxdepth 1 -mindepth 1 ! -type d -print -quit`" ]\ ' sh {} \; -print 

Wegen der -empty, -maxdepth, -mindepthund -quit, die nicht in POSIX ist, kann die Lösung nicht in Ihrem O arbeitet ( -print -quitnur die Dinge zu beschleunigen, können Sie dieses Fragment weglassen, -maxdepth 1 -mindepth 1ist wichtig, obwohl).

Der Trick besteht darin, für jedes nicht leere Verzeichnis eine separate Shell auszuführen, die (nicht rekursiv) prüft, ob das Verzeichnis kein Nichtverzeichnis enthält. Dies geschieht mit -exec sh … \;, es dient hier als Test. Wenn das Verzeichnis kein Nichtverzeichnis enthält, ist die Ausgabe des inneren Verzeichnisses findleer. Der test ( [ -z … ]) gibt den Exit-Status zurück 0, shkehrt zurück 0und -execist true.