2009-12-30 4 views
2

j'utilisais la valeur de retour de fgrep -s 'text' /folder/*.txt pour trouver si « texte » est toutfichier txt dans /dossier/. Cela fonctionne, mais je le trouve trop lent pour ce dont j'ai besoin, comme s'il cherchait 'text' dans tous les fichiers avant de me donner une réponse.moyen le plus rapide pour trouver le texte dans le dossier

J'ai besoin de quelque chose qui me donne rapidement une réponse oui/non quand il trouve au moins un fichier avec le 'texte'. Probablement un script awk.

+0

Un script Python/Perl –

+2

Une réponse "non" sera toujours lente en utilisant cette méthode parce que Si vous voulez quelque chose de plus rapide, vous devez indexer les fichiers d'une façon ou d'une autre –

+0

Votre question pourrait être un peu ambiguë ou je pourrais être trop le nking. Votre commande 'fgrep' recherche les occurrences de la chaîne 'texte' dans tous les fichiers .txt dans/dossier /, mais votre * question * dit" pour trouver s'il y a un fichier .txt dans/dossier/". Si la réponse de ** mopoke ** ci-dessus devrait aider, bien qu'elle continue à chercher * chaque * fichier. Si ce dernier, alors vous devriez utiliser 'find' - voir ma réponse pour plus de détails. –

Répondre

1

Vous pouvez l'utiliser pour raccourcir votre recherche si c'est le type qui serait basé sur mopoke's answer. Cela arrête après le premier match dans le premier fichier dans lequel il se trouve:

# found=$(false) 
found=1 # false 
text="text" 
for file in /folder/*.txt 
do 
    if fgrep -m1 "$text" "$file" > /dev/null 
    then 
     found=$? 
     # echo "$text found in $file" 
     break 
    fi 
done 
# if [[ ! $found ]] 
# then 
# echo "$text not found" 
# fi 
echo $found # or use exit $found 

Modifier: a commenté quelques lignes et fait quelques autres changements.

S'il y a un grand nombre de fichiers, le for pourrait échouer et vous devez utiliser une boucle while avec un find canalisé en elle.

Si tout ce que vous voulez faire est de savoir s'il y a tout fichier txt dans un dossier quel que soit le contenu du fichier, utilisez quelque chose comme ça tout seul:

find /folder -name "*.txt" 
+0

Je voudrais essayer le sien, sans de '-m1', mais j'en ai besoin pour retourner 1 s'il y a une correspondance et 0 sinon. Pas en tant qu'impression d'écho, mais en tant que valeur de retour d'une commande. Merci! – lamcro

+0

Désolé de demander, mais le langage de script est-ce? Je devine Bash. – lamcro

+0

Oui, c'est Bash, mais quelque chose de similaire pourrait être fait avec d'autres coques. Quelle coquille utilisez-vous? Normalement, 0 est vrai et 1 est faux. Essayez ceci dans Bash: 'true; echo $ ?; faux; echo $? '- vous devriez obtenir un zéro puis un. Voir mon edit ci-dessus pour montrer comment faire usage de ceci. –

5

Si je comprends bien votre question, vous voulez:

fgrep -m1 

qui arrête après un match.

+0

Juste essayé et ça ne fonctionne pas. Option illégale. Je l'utilise sur une machine Solaris. – lamcro

0

bâtiment sur la réponses ci-dessus, cela devrait le faire, je pense?

find /folder -name \*.txt -exec grep "text" {}\; 

Mais je ne suis pas sûr que je comprends très bien le problème: est « fgrep » faire une récursion pleine profondeur avant qu'il ne commence la sortie ou quelque chose? La trouvaille devrait rapporter comme il-trouve ainsi peut-être mieux pour ce dont vous avez besoin, ne sais pas.

[modifier, non testé]: Changer le grep ci-dessus pour un script shell qui fait quelque chose comme:

grep "text" && exit 0 || exit 1 

Pour obtenir le vrai | faux chose que vous devez travailler (vous aurez besoin pour jouer avec cela, n'ont pas testé exactement les étapes ici - pas d'accès à Unix pour le moment :-()

Questions connexes