web-dev-qa-db-fra.com

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

J'exécute la commande suivante, mais elle n'est pas exécutée récursivement:

find . -name *.Java

Je sais qu'il existe des fichiers Java plus bas dans le répertoire actuel, mais il exécute le find sur le répertoire actuel uniquement. J'utilise OS X, 10.9.

69
user11498

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

find . -name '*.Java'

Explication

Sans les guillemets, le shell interprète *.Java en tant que modèle de glob et l'étend à tous les noms de fichiers correspondant au glob avant de le passer à find. De cette façon, si vous aviez, disons, foo.Java dans le répertoire courant, la ligne de commande réelle de find serait:

find . -name foo.Java

qui listerait évidemment le fichier dans le répertoire courant uniquement (sauf si vous avez des fichiers de même nom plus bas dans l'arborescence).

La citation empêche l'expansion de glob et passe la ligne de commande à find telle quelle.

Par ailleurs, si le glob n'a pas réussi à correspondre (pas de *.Java fichiers dans le répertoire courant), vous obtiendriez l'un des deux comportements selon la façon dont votre shell est configuré pour gérer les globes qui ne correspondent pas (ceci est régi par l'option nullglob dans Bash, par exemple ):

  1. Si un glob qui ne correspond pas n'est pas développé par le Shell, find présentera (accidentellement, attention) un comportement correct.
  2. Si un glob qui ne correspond pas est développé dans une chaîne vide par le shell, find se plaindra qu'il manque un argument à -name.
91
Joseph R.

J'avais une situation similaire où j'entourais la valeur -name entre guillemets, mais je n'obtenais toujours pas tous les résultats de recherche que j'espérais. J'ai supposé que c'était à cause des liens symboliques et bien sûr que c'était le cas. Si vous souhaitez forcer find à rechercher dans les liens symboliques, vous pouvez modifier la commande comme suit:

find -L . -name '*.Java'
23
gaoagong

Échapper au *

find . -name \*.Java
0
Stuart Cardall