Je veux trouver tous les répertoires avec une chaîne spécifique afin que je puisse faire une autre recherche sur les fichiers contenus dans.
Je ne veux donc pas perdre de temps, ./my-search-term/dir/my-search-term
etc.
Comment puis-je arrêter la récurrence lorsque j'ai trouvé le premier répertoire my-search-term?
Réponses:
L'
-prune
actionfind
ne fait pas rentrer dans le répertoire. Vous pouvez le combiner avec une autre action telle que-exec
(l'ordre de-prune
et-exec
n'a pas d'importance, tant qu'il-prune
est exécuté de toute façon).Notez que l'imbrication à l'
find
intérieur d'unfind -exec
peut être un peu problématique: vous ne pouvez pas l'utiliser-exec
à l'intérieurfind
, car le terminateur serait considéré comme un terminateur par l'extérieurfind
. Vous pouvez contourner cela en invoquant un shell, mais méfiez-vous des citations.la source
-prune
renvoie true et peut être placé avant le-exec
.-o
, je suppose. Et je suppose que mettre-prune
avant-exec
est plus lisible.-prune
option avant.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
donne l'erreur:find: ./x1: No such file or directory
. La solution est d'ajouter-prune
en fin defind
commande.find
expand,{}
même si elles apparaissent comme une sous-chaîne d'un argument à-exec
. Une telle version defind
va étouffer votre deuxième commande, car la commande{}
dans lafind
commande interne (dans la commande shell) sera remplacée par le nom du répertoire trouvé dans la commande externefind
. Vous pouvez résoudre ce problème en disant,find . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
c'est-à-dire en utilisant"{"}
, dans lequel le shell se transformera{}
. … (Suite)- solutions nues -
Si vous souhaitez
find
ignorer le contenu du répertoire trouvé, mais continuer la recherche dans d'autres répertoires, utilisez-prune
comme suggéré @laebshade. La commande complète devrait alors ressembler àD'un autre côté, si vous voulez arrêter
find
complètement la recherche et après avoir trouvé le premier répertoire correspondant, alors ce que vous recherchez est-quit
(disponible depuis la version4.2.3
deGNU find
). Celui-ci est un peu plus délicat à utiliser, car il faitfind
sortir immédiatement - il-quit
doit donc être placé à la toute fin de la commande:Pour que cela fonctionne comme prévu, il faut s'assurer que les
-exec
retours sont vrais (en d'autres termes, un statut zéro ). Si vous souhaitez que l'état de sortie de-exec
soit ignoré, afin que cela-quit
fonctionne toujours, vous avez besoin d'une petite astuce:ou
ou
- quelques explications -
La chose la plus importante sur le
find
fonctionnement est que toutes les actions ("tests") sont traitées comme des prédicats logiques interprétés de gauche à droite. Par conséquent, la dernière action (par exemple-quit
) ne sera effectuée que si toute la partie précédente n'est pas retournée fausse . Par défaut, tous les tests sont joints avec un "ET" logique, l'-o
option change le joint en "OU".Un élément délicat
-o
est que vousfind
pouvez "optimiser" votre commande et ne pas exécuter la-exec
partie si vous tapez justePour y faire face, vous pouvez forcer l'
find
évaluation de tous les prédicats jonés avec "OU", en les mettant entre parenthèses.la source