75 Stimmen

Rekursiv alle Dateien finden, die einem bestimmten Muster entsprechen

Ich muss alle Dateien finden (oder genauer gesagt, zählen), die diesem Muster entsprechen:

*/foo/*.doc

Wobei das erste Platzhalter-Asteriskus eine variable Anzahl von Unterverzeichnissen einschließt.

67voto

rici Punkte 218780

Mit gnu find können Sie Regex verwenden, die (im Gegensatz zu -name) den gesamten Pfad abgleichen:

find . -regex '.*/foo/[^/]*.doc'

Um nur die Anzahl der Dateien zu zählen:

find . -regex '.*/foo/[^/]*.doc' -printf '%i\n' | wc -l

(Der %i Formatcode bewirkt, dass find die Inode-Nummer anstelle des Dateinamens ausgibt; im Gegensatz zum Dateinamen ist die Inode-Nummer garantiert keine Zeichen wie ein Zeilenumbruch zu haben, so dass das Zählen zuverlässiger ist. Vielen Dank an @tripleee für den Vorschlag.)

Ich weiß allerdings nicht, ob das auf OSX funktioniert.

14voto

MonkeyWidget Punkte 966

Wie wäre es mit:

find BASE_OF_SEARCH/*/foo -name \*.doc -type f | wc -l

Was dies macht:

  • beginne im Verzeichnis BASE_OF_SEARCH/
  • suche in allen Verzeichnissen, die ein Verzeichnis foo haben
  • suche nach Dateien, die wie *.doc benannt sind
  • zähle die Zeilen des Ergebnisses (eine pro Datei)

Der Vorteil dieser Methode:

  • nicht rekursiv oder iterativ (keine Schleifen)
  • es ist einfach zu lesen und wenn Sie es in ein Skript einbeziehen, ist es ziemlich einfach zu entschlüsseln (manchmal ist RegEx es nicht).

UPDATE: Möchten Sie eine variable Tiefe? okay:

find BASE_OF_SEARCH -name \*.doc -type f | grep foo | wc -l

  • beginne im Verzeichnis BASE_OF_SEARCH
  • suche nach Dateien, die wie *.doc benannt sind
  • zeige nur die Zeilen dieses Ergebnisses an, die "foo" enthalten
  • zähle die Zeilen des Ergebnisses (eine pro Datei)

Optional könnten Sie Ergebnisse filtern, die "foo" im Dateinamen haben, weil dies diese auch zeigt.

13voto

Tsitsi_Catto Punkte 131

Auf der Grundlage der Antworten auf dieser Seite konnte ich auf anderen Seiten folgendes zusammenstellen, wobei in dem aktuellen Ordner und allen darunter liegenden Ordnern nach allen Dateien gesucht wird, die die Erweiterung pdf haben, gefolgt von einer Filterung für diejenigen, die test_text im Titel enthalten.

find . -name "*.pdf" | grep test_text | wc -l

2voto

mpez0 Punkte 2689

Ungetestet, aber probiere es aus:

find . -type d -name foo -print | while read d; do echo "$d/*.doc" ; done | wc -l

Finde alle "foo"-Verzeichnisse (in unterschiedlichen Tiefen) (das ignoriert Symlinks, falls das Teil des Problems ist, können sie hinzugefügt werden); verwende Shell-Globbing, um alle ".doc"-Dateien zu finden, und zähle sie dann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X