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 findliefert zu untersuchende Verzeichnisse. Zwei innere find-s prüfen, ob sich mindestens eine .txtDatei und keine Nicht- .txtDateien im Verzeichnis befinden. shShell implementiert Logik mit [ … ]und &&.
Anmerkungen:
-maxdepthwird von POSIX nicht benötigt. Für den POSIX-Ansatz siehe diese Frage .-quitwird von POSIX nicht benötigt. Diese Aktion wird findbeendet, sobald eine übereinstimmende Datei gemeldet wird. Dies ist nützlich, da wir höchstens eine übereinstimmende Datei benötigen, um das Ergebnis mit wc -lund zu erhalten. Ein [ … ]vorzeitiges Beenden spart also Zeit. Ohne -quitden 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 headwird die Pipe nach der ersten gefundenen Datei beendet, wcdas Ergebnis wird sofort ausgegeben, aber finddie unterbrochene Pipe wird nur dann bemerkt, wenn (falls) versucht wird, eine weitere Zeile zu schreiben . Und es ist ein Kompromiss: headSie sparen möglicherweise Zeit und Ressourcen, aber (als separater Prozess) müssen Zeit und Ressourcen in jedem Verzeichnis zweimal erzeugt werden.wc -laber 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.