Wie findet man rekursiv Ordner auf einem Linux-System, das nur Ordner enthält?

Wie findet man rekursiv Ordner auf einem Linux-System, das nur Ordner enthält?

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

Beispielsweise 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

folder2Ich würde gerne auf „und nur“ klicken, folder3da es selbst keine Dateien enthält, sondern nur Ordner (mit Dateien).

Antwort1

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

Dies ist eine Liste nicht leerer Ordner (mindestens ein Element darin), ausgenommen solche, die Dateien enthalten. Wenn Sie auch Dinge wie Pipes und Symlinks ausschließen möchten, können Sie ! -type danstelle von verwenden -type f. Dies kann nicht in einer einzelnen Find-Anweisung durchgeführt werden, da Find keine Übereinstimmungen mit komplexen Inhaltskriterien finden kann (dies ist kein XPath).

Antwort2

Wenn ich Sie richtig verstehe, sollte es folgendermaßen funktionieren:

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

Aufgrund von -empty, -maxdepth, -mindepthund -quit, die nicht in POSIX enthalten sind, funktioniert die Lösung in Ihrem Betriebssystem möglicherweise nicht (die Lösung -print -quitdient nur der Beschleunigung, Sie können dieses Fragment weglassen; -maxdepth 1 -mindepth 1es ist jedoch wichtig).

Der Trick besteht darin, für jedes nicht leere Verzeichnis eine separate Shell auszuführen, die (nicht rekursiv) prüft, ob das Verzeichnis keine Nicht-Verzeichnisse enthält. Dies geschieht mit -exec sh … \;, es fungiert hier als Test. Wenn das Verzeichnis keine Nicht-Verzeichnisse enthält, ist die Ausgabe des inneren findleer, sodass der Test ( [ -z … ]) den Beendigungsstatus zurückgibt 0, shzurückgibt 0, -execwahr ist.

verwandte Informationen