Suchen Sie bei gegebenem Dateityp .txt alle Verzeichnisse, die nur diesen Dateityp haben.
Zum Beispiel
a--
b-- 1.txt
c--
|
---- 2.jpg
---- 3.txt
Der Befehl soll nur b
nicht ausgeben c
.
linux
operating-systems
Jibin
quelle
quelle
find
, Kandidatenverzeichnisse abrufen, die mindestens diesen Dateityp enthalten, und die Ausgabe über ein Skript nachbearbeiten, das die "einzige" Bedingung überprüft.Antworten:
Das äußere
find
liefert zu untersuchende Verzeichnisse. Zwei innerefind
-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 wirdfind
beendet, sobald eine übereinstimmende Datei gemeldet wird. Dies ist nützlich, da wir höchstens eine übereinstimmende Datei benötigen, um das Ergebnis mitwc -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 verwendenfind … | head -n 1 | wc -l
; In diesem Fallhead
wird die Pipe nach der ersten gefundenen Datei beendet,wc
das Ergebnis wird sofort ausgegeben, aberfind
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 .quelle