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 find
concerne que le répertoire en cours. J'utilise OS X, 10.9.
Réponses:
Le problème est que vous n'avez pas cité votre
-name
paramètre. Faites ceci à la place:Explication
Sans les guillemets, le shell est interprété
*.java
comme un motif glob et l’élargit à tous les noms de fichiers correspondant au glob avant de le transmettrefind
. De cette façon, si vous aviez, par exemple,foo.java
dans le répertoire en cours,find
la ligne de commande réelle serait: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
find
tel quel.Incidemment, si le glob n’était pas compatible (aucun
*.java
fichier 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’nullglob
option de Bash , par exemple):find
affichera (accidentellement, attention) un comportement correct.find
plaindrez qu'il manque un argument-name
.la source
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:
la source
-follow
est un synonyme plus lisible pour-L
, tant que vous le mettez avant les autres paramètres.Échapper à la
*
la source