web-dev-qa-db-fra.com

Rechercher récursivement tous les fichiers correspondant à un certain motif

Je dois trouver (ou plus précisément compter) tous les fichiers correspondant à ce modèle:

*/foo/*. doc

Où le premier astérisque générique comprend un nombre variable de sous-répertoires.

40
pw222

Avec gnu find, vous pouvez utiliser regex, qui (contrairement à -name) correspond au chemin entier:

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

Pour ne compter que le nombre de fichiers:

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

(Le %i code de format provoque find imprimer le numéro d’inode au lieu du nom de fichier; À la différence du nom de fichier, le numéro d'inode est garanti sans caractères, comme une nouvelle ligne. Le calcul est donc plus fiable. Merci à @tripleee pour la suggestion.)

Je ne sais pas si cela fonctionnera sous OSX, cependant.

41
rici

que diriez-vous:

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

Qu'est-ce que cela fait:

  • commencez au répertoire BASE_OF_SEARCH /
  • regarder dans tous les répertoires qui ont un répertoire foo
  • rechercher des fichiers nommés comme * .doc
  • compter les lignes du résultat (une par fichier)

L'avantage de cette méthode:

  • non récursif ni itératif (pas de boucles)
  • c'est facile à lire, et si vous l'incluez dans un script, c'est assez facile à déchiffrer (les expressions rationnelles ne le sont parfois pas).

UPDATE: vous voulez une profondeur variable? D'accord:

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

  • commencez au répertoire BASE_OF_SEARCH
  • rechercher des fichiers nommés comme * .doc
  • affiche uniquement les lignes de ce résultat incluant "foo"
  • compter les lignes du résultat (une par fichier)

Vous pouvez éventuellement filtrer les résultats dont le nom contient "foo", car cela les affichera également.

9
MonkeyWidget

Sur la base des réponses données sur cette page d’autres pages, j’ai réussi à rassembler les éléments suivants, dans lesquels une recherche est effectuée dans le dossier actuel et dans tous les autres dossiers inférieurs pour tous les fichiers portant l’extension pdf, suivie de un filtrage pour ceux qui contiennent test_text sur leur titre.

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

Non testé, mais essayez:

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

trouver tous les répertoires "foo" (à différentes profondeurs) (ceci ignore les liens symboliques, si cela fait partie du problème, vous pouvez les ajouter); utilisez Shell Globbing pour trouver tous les fichiers ".doc", puis comptez-les.

2
mpez0