Jexécute la commande suivante, mais elle nest pas exécutée de manière récursive:
find . -name *.java
Je sais quil y a des fichiers java plus bas dans le répertoire actuel mais il exécute le find
sur le répertoire courant uniquement. Jutilise OS X, 10.9.
Réponse
Le problème est que vous navez « pas cité votre . Faites-le à la place:
find . -name "*.java"
Explication
Sans les guillemets, le shell interprète *.java
comme un motif global et létend à tous les noms de fichiers correspondant au glob avant de le transmettre à find
. De cette façon, si vous aviez, disons, foo.java
dans le répertoire actuel, find
« serait:
find . -name foo.java
qui listerait évidemment le fichier dans le répertoire courant uniquement (sauf si vous avez des noms similaires find
tel quel.
Les citations empêchent lexpansion de glob et passent la ligne de commande à find
telle quelle.
Incidemment, si le glob ne correspondait pas (pas de fichiers *.java
dans le répertoire actuel tory), vous obtiendrez lun des deux comportements selon la configuration de votre shell pour gérer les globes qui ne correspondent pas (ceci est régi par loption nullglob
dans Bash, par exemple ):
- Si un glob qui ne correspond pas nest pas développé par le shell,
find
affichera (par inadvertance, attention) un comportement correct. - Si un glob qui ne correspond pas est développé dans une chaîne vide par le shell,
find
se plaindra quil manque un argument pour-name
.
Réponse
Jai eu une situation similaire où jentourais le -name valeur entre guillemets, mais nobtenait toujours pas tous les résultats de recherche que jespérais. Jai supposé que cétait à cause des liens symboliques et bien sûr que cétait le cas. Si vous voulez forcer Find à rechercher via des liens symboliques, vous pouvez modifier la commande comme suit:
find -L . -name "*.java"
Commentaires
Réponse
Échapper à *
find . -name \*.java
-follow
est un synonyme plus lisible de-L
, à condition que vous le placiez avant les autres paramètres.