Recursief alle bestanden vinden die overeenkomen met een bepaald patroon

Ik moet alle bestanden vinden (of meer specifiek tellen) die overeenkomen met dit patroon:

*/foo/*.doc

Waarbij het eerste sterretje met jokerteken een variabel aantal submappen bevat.


Antwoord 1, autoriteit 100%

Met gnu find kun je regex gebruiken, die (in tegenstelling tot -name) overeenkomt met het volledige pad:

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

Om alleen het aantal bestanden te tellen:

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

(De %iformaatcode zorgt ervoor dat findhet inodenummer afdrukt in plaats van de bestandsnaam; in tegenstelling tot de bestandsnaam bevat het inodenummer gegarandeerd geen tekens zoals een newline, dus tellen is betrouwbaarder. Met dank aan @tripleee voor de suggestie.)

Ik weet echter niet of dat zal werken op OSX.


Antwoord 2, autoriteit 18%

wat dacht je van:

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

Wat dit doet:

  • begin bij directory BASE_OF_SEARCH/
  • kijk in alle mappen die een map foo hebben
  • zoek naar bestanden met de naam *.doc
  • tel de regels van het resultaat (één per bestand)

Het voordeel van deze methode:

  • niet recursief noch iteratief (geen lussen)
  • het is gemakkelijk te lezen en als je het in een script opneemt, is het vrij eenvoudig te ontcijferen (regex soms niet).

UPDATE: wil je variabele diepte? oke:

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

  • begin bij directory BASE_OF_SEARCH
  • zoek naar bestanden met de naam *.doc
  • toon alleen de regels van dit resultaat die “foo” bevatten
  • Tel de regels van het resultaat (één per bestand)

Optioneel kunt u resultaten uit filteren die “foo” in de bestandsnaam hebben, omdat dit ook die ook zal tonen.


Antwoord 3, Autoriteit 9%

Op basis van de antwoorden op deze pagina op andere pagina’s, slaagde er in het volgende aan om het volgende samen te stellen, waar een zoekopdracht wordt uitgevoerd in de huidige map en alle anderen eronder voor alle bestanden die de extensie PDF hebben , gevolgd door een filtering voor degenen die Test_Text op hun titel bevatten.

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

Antwoord 4, Autoriteit 4%

Niettest, maar probeer:

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

Zoek alle directory’s “FOO” (bij verschillende diepten) (dit negeert symlinks, als dat deel uitmaakt van het probleem dat u ze kunt toevoegen); Gebruik Shell Blobbing om alle “.doc” -bestanden te vinden, tel ze dan.

Other episodes