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.
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 ):
find
présentera (accidentellement, attention) un comportement correct.find
se plaindra qu'il manque un argument à -name
.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'
Échapper au *
find . -name \*.Java