Finden Sie alle Verzeichnisse, die nur einen Dateityp haben

-1

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 bnicht ausgeben c.

Jibin
quelle
Bitte fügen Sie ein OS-Tag hinzu. Für Linux: Ich würde wahrscheinlich ausführen find, Kandidatenverzeichnisse abrufen, die mindestens diesen Dateityp enthalten, und die Ausgabe über ein Skript nachbearbeiten, das die "einzige" Bedingung überprüft.
Dirkt

Antworten:

1
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.
  • Pfade mit Zeilenumbrüchen (falls vorhanden) werden täuschen, 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 .
Kamil Maciorowski
quelle