Antworten:
find . -type d -execdir sh -c '
[ "$(find "$1" -maxdepth 1 -type f -name "*.txt" -print -quit | wc -l)" -gt 0 ] &&
[ "$(find "$1" -maxdepth 1 -type f ! -name "*.txt" -print -quit | wc -l)" -eq 0 ]
' find-sh {} \; -print
Das äußere find
liefert zu untersuchende Verzeichnisse. Zwei innere find
-s prüfen, ob sich mindestens eine .txt
Datei und keine Nicht- .txt
Dateien im Verzeichnis befinden. sh
Shell implementiert Logik mit [ … ]
und &&
.
Anmerkungen:
-maxdepth
wird von POSIX nicht benötigt. Für den POSIX-Ansatz siehe diese Frage .-quit
wird von POSIX nicht benötigt. Diese Aktion wird find
beendet, sobald eine übereinstimmende Datei gemeldet wird. Dies ist nützlich, da wir höchstens eine übereinstimmende Datei benötigen, um das Ergebnis mit wc -l
und zu erhalten. Ein [ … ]
vorzeitiges Beenden spart also Zeit. Ohne -quit
den ganzen Befehl funktioniert, wird es nur langsamer sein , wenn es viele Dateien. Alternativ können Sie verwenden find … | head -n 1 | wc -l
; In diesem Fall head
wird die Pipe nach der ersten gefundenen Datei beendet, wc
das Ergebnis wird sofort ausgegeben, aber find
die unterbrochene Pipe wird nur dann bemerkt, wenn (falls) versucht wird, eine weitere Zeile zu schreiben . Und es ist ein Kompromiss: head
Sie sparen möglicherweise Zeit und Ressourcen, aber (als separater Prozess) müssen Zeit und Ressourcen in jedem Verzeichnis zweimal erzeugt werden.wc -l
aber es spielt keine Rolle, da diese zusätzlichen Zeilen die Anzahl nur erhöhen können, wenn die "richtige" Anzahl ohnehin ungleich Null ist und wir nur wissen müssen, ob das Ergebnis Null ist oder nicht .
find
, Kandidatenverzeichnisse abrufen, die mindestens diesen Dateityp enthalten, und die Ausgabe über ein Skript nachbearbeiten, das die "einzige" Bedingung überprüft.