Existe-t-il un moyen idiomatique pour détecter si "trouver" a trouvé des correspondances? J'utilise actuellement
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
mais cela me semble un peu indirect. De plus, j'aimerais que la recherche s'arrête une fois qu'elle a trouvé une correspondance, afin de ne pas perdre de temps et d'efforts. J'ai juste besoin de savoir s'il existe des fichiers qui correspondent.
Mise à jour: j'ai fait l'erreur d'écrire ma question sans le code devant moi: j'utilise wc -l
dans un cas différent, où j'ai besoin de connaître le nombre total de fichiers trouvés de toute façon. Dans le cas où je teste uniquement s'il y a des correspondances, j'utilisais if [ -z $(find …) ]
.
-n
que cela ne s'appliquait qu'aux variables "définies" ($ abc, $ xyz, etc.), mais je suppose que $ (...) est une variable temporaire "définie" .. +1 ... (et je viens lisez récemment que l'utilisation-n
est risquée, sauf si vous êtes sûr que la variable n'a pas déjà été déclarée et qu'elle est 'inutilisée) ... mais un temp n'aura pas cette possibilité ... ie. non initialisé vs vide-n
teste si une chaîne est vide, elle n'a rien à voir avec les variables. Ce que vous avez lu disait probablement que l'utilisation-n
ne teste pas si une variable est définie:-n "$foo"
est fausse sifoo
est définie mais vide et affiche un message d'erreur sousset -u
.[ -n "${foo+1}" ]
teste de manière fiable s'ilfoo
est défini, mais le traitement identique des variables vides et non définies est généralement une bonne idée:,[ -n "${foo:+1}" ]
ou tout simplement[ -n "$foo" ]
si cela ne vous inquiète passet -u
.-quit
disponible, mais la tuyauteriehead -n 1
fonctionne (comme le faithead -c 1
, qui s'arrête encore plus tôt, mais probablement avec un avantage négligeable). De plus, j'ai fait l'erreur d'écrire ma question sans le code devant moi: j'utilisewc -l
dans un cas différent, où j'ai besoin de connaître le nombre total de fichiers trouvés. Dans le cas où je teste uniquement s'il y a des correspondances, j'utilisaisif [ -z `find … ` ]
.Vous pouvez utiliser l'
-quit
action pour arrêter après le premier match. Vous voudrez probablement combiner cela avec une autre action (comme-print
) ou vous ne pourrez pas dire s'il a trouvé quelque chose.Par exemple,
find ... -print -quit
imprime le chemin du premier fichier correspondant, puis quitte. Ou, vous pouvez utiliser-printf 1 -quit
pour imprimer 1 s'il y a une correspondance et rien s'il n'y en a pas.find
Le statut de sortie de '' reflète s'il y a eu des erreurs lors de la recherche, et non s'il a trouvé quelque chose, vous devez donc vérifier sa sortie pour voir s'il y a une correspondance.la source
-quit
est une extension GNU. Il ne fonctionnera pas sur les systèmes utilisant d'autres implémentations de find (1), comme OS X, les BSD et probablement la plupart des Unices commerciaux.La sortie 0 est facile avec find, la sortie> 0 est plus difficile car cela ne se produit généralement qu'avec une erreur. Cependant, nous pouvons y arriver:
Notez que cette solution est plus performante que l'utilisation d'un sous-shell; exécuter faux est certainement plus rapide que d'exécuter même Dash:
la source
Vous pouvez l'envelopper dans l'état de la coque, par exemple:
Où
...
est votre condition de match, par exemple-name *.txt
.Quelques autres exemples:
la source