Pourquoi ma découverte n'est-elle pas récursive?


65

J'exécute la commande suivante, mais elle n'est pas exécutée de manière récursive:

find . -name *.java

Je sais qu'il y a des fichiers java plus bas dans le répertoire en cours, mais cela ne findconcerne que le répertoire en cours. J'utilise OS X, 10.9.


@Gilles: Ce Q & R est beaucoup plus clair et moins localisé que la dupe - si l’un d’eux doit être fermé, c’est l’autre.
goldilocks

Réponses:


88

Le problème est que vous n'avez pas cité votre -nameparamètre. Faites ceci à la place:

find . -name '*.java'

Explication

Sans les guillemets, le shell est interprété *.javacomme un motif glob et l’élargit à tous les noms de fichiers correspondant au glob avant de le transmettre find. De cette façon, si vous aviez, par exemple, foo.javadans le répertoire en cours, findla ligne de commande réelle serait:

find . -name foo.java

ce qui ne ferait évidemment apparaître le fichier que dans le répertoire courant (à moins que vous ne disposiez de fichiers portant le même nom plus loin dans l’arborescence).

La citation empêche l'expansion globale et passe la ligne de commande à l'état findtel quel.

Incidemment, si le glob n’était pas compatible (aucun *.javafichier dans le répertoire en cours), vous obtiendriez l’un des deux comportements suivants en fonction de la configuration de votre shell pour gérer les globs qui ne correspondent pas (ceci est régi par l’ nullgloboption de Bash , par exemple):

  1. Si un glob qui ne correspond pas n'est pas développé par le shell, findaffichera (accidentellement, attention) un comportement correct.
  2. Si un glob qui ne correspond pas est développé dans une chaîne vide par le shell, vous vous findplaindrez qu'il manque un argument -name.

20

Dans une situation similaire, j'entourais la valeur -name de guillemets, mais je n'obtenais toujours pas tous les résultats de recherche que j'espérais. Je conjecturai que c'était à cause des liens symboliques et bien sûr que c'était le cas. Si vous souhaitez forcer la recherche à rechercher par le biais de liens symboliques, vous pouvez modifier la commande comme suit:

find -L . -name '*.java'

Les liens symboliques étaient aussi mon problème. -followest un synonyme plus lisible pour -L, tant que vous le mettez avant les autres paramètres.
Noumenon

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.