Finden Sie alle Verzeichnisse, die nur einen Dateityp haben

597
Jibin

Suchen Sie bei einem Dateityp .txt alle Verzeichnisse, die nur diesen Dateityp haben.

Zum Beispiel

a-- b-- 1.txt c-- | ---- 2.jpg ---- 3.txt 

Der Befehl sollte nur bnicht ausgeben c.

-1
Bitte fügen Sie ein Betriebssystem-Tag hinzu. Für Linux: Ich würde wahrscheinlich `find 'ausführen, Kandidatenverzeichnisse abrufen, die mindestens diesen Dateityp enthalten, und die Ausgabe über ein Skript nachbearbeiten, das die" einzige "Bedingung überprüft. dirkt vor 5 Jahren 0

1 Antwort auf die Frage

0
Kamil Maciorowski
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 

Die äußeren findVersorgungsverzeichnisse werden geprüft. Zwei innere find-s prüfen, ob sich im Verzeichnis mindestens eine .txtDatei und keine Nicht- .txtDateien befinden. shShell implementiert Logik mit [ … ]und &&.

Anmerkungen:

  • -maxdepthwird von POSIX nicht benötigt. Zum 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 zu erhalten, wc -lund [ … ]wenn Sie das Programm frühzeitig beenden, sparen Sie Zeit. Ohne -quitden gesamten Befehl funktioniert es nur, wenn viele Dateien vorhanden sind. 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 angezeigt, sie findwird jedoch nur dann erkannt, wenn die Pipe (wenn) versucht, eine weitere Zeile zu schreiben . Und es ist ein Kompromiss: headVielleicht sparen Sie Zeit und Ressourcen, aber (als separater Prozess) benötigt es Zeit und Ressourcen, um zweimal in jedem Verzeichnis erzeugt zu werden.
  • Pfade mit Zeilenumbrüchen (falls vorhanden) täuschen, wc -laber es spielt keine Rolle, da diese zusätzlichen Zeilenumbrüche möglicherweise nur dann zu der Zählung beitragen, wenn die "richtige" Anzahl ohnehin ungleich Null ist und wir nur wissen müssen, ob das Ergebnis Null ist oder nicht .