Ich versuche, einen Befehl auszuarbeiten, der rekursiv Verzeichnisse findet, die nur ein oder mehrere Verzeichnisse auf derselben Ebene enthalten. Am besten mit dem find
Befehl. 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
folder2
Ich würde gerne auf „und nur“ klicken, folder3
da 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 d
anstelle 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
, -mindepth
und -quit
, die nicht in POSIX enthalten sind, funktioniert die Lösung in Ihrem Betriebssystem möglicherweise nicht (die Lösung -print -quit
dient nur der Beschleunigung, Sie können dieses Fragment weglassen; -maxdepth 1 -mindepth 1
es 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 find
leer, sodass der Test ( [ -z … ]
) den Beendigungsstatus zurückgibt 0
, sh
zurückgibt 0
, -exec
wahr ist.