8
votes

Rechercher String: Trouver et Grep

Il doit y avoir une meilleure façon de faire cela: xxx pré>

aussi, pour rechercher uniquement par exemple. Fichiers HTML: P>

 # find . | grep html$ | xargs grep <string-to-find>


12 commentaires

Vous n'êtes pas sûr de quoi voulez-vous dire de mieux?


J'imaginais que nous pouvons peut-être utiliser une seule commande; Ou, tout ce qui est plus efficace.


Passer tous les noms de fichiers à grep avec xargs ne fonctionnera pas si la liste des fichiers est trop longue.


@Radu: Merci d'avoir souligné cela. La limite est-elle documentée quelque part?


@ Siku-siku.com, vous pouvez le trouver défini comme arg_max dans Inclure / linux / limites.h dans le noyau Linux, et il a une valeur par défaut de 131072 .


Wow ... c'est un détail sérieux et sérieux! Génial merci!


C'est le nombre maximum d'arguments pouvant être transmis à une commande. Xargs obtient son tuyau de données de données (pas comme des arguments). Pour chaque ligne une seule ligne, la commande d'appels d'entrée XARGS (GREP dans ce cas) avec cette ligne unique est passée à titre d'argument (SO Grep ne reçoit qu'un seul fichier à rechercher, pas tous). Exemple donné ne souffre pas d'arg_max limite.


@Ivan, xargs reçoit effectivement les données d'argument via le tuyau, mais il doit ensuite exécuter la commande avec les arguments compilés à partir des données qu'il a reçues. C'est là que le nombre maximum d'arguments entre en jeu. Si xargs doit exécuter une commande avec un million d'arguments (ce qu'il a reçu de stdin ), le système d'exploitation se plaint.


@Ivan, aussi, xargs n'exécute pas la commande avec chaque argument. Il compile une liste de tous les arguments et alors exécute la commande.


@RADU OK, j'ai vraiment besoin de vérifier cela ainsi. La documentation dit ceci: Xargs lit les éléments de l'entrée standard, délimité par des blancs ou des lignes neuves et exécute la commande (par défaut / bin / echo) une ou plusieurs fois avec des arguments initiaux suivis d'éléments lus à partir de l'entrée standard. Maintenant "un ou plusieurs temps" était plutôt déroutant, j'ai écrit un script simple qui écrit le nombre de Args qu'il a reçu et a couru de la recherche / | test.py. Le résultat est que Xargs appelle ma bande de script de fois, mais avec des centaines de paramètres.


@Ivan, tu as raison, j'ai remarqué cela dans le manuel. En fait, j'ai utilisé cette commande très souvent, et cela dépendait, même dans certains scripts de production et cela a fonctionné comme je m'attendais à ce que cela fonctionne. Mais je ne l'ai jamais envoyé trop d'arguments, je n'ai donc pas vu cela exécuter la commande plus d'une fois. Merci d'avoir testé, c'est bon de savoir.


En fait, je l'ai toujours utilisé avec une hypothèse qui exécute une commande par ligne d'entrée jusqu'à maintenant. Donc, merci d'éclaircir moi :).


4 Réponses :


23
votes
find . -name \*.html -exec grep -H string-to-find {} \;

4 commentaires

Souhaitez-vous expliquer les constructions `{}` à la fin de la commande?


Si vous n'utilisez pas quelque chose d'exotique Xargs ne devrait pas attendre que la recherche soit terminée. Systèmes d'exploitation modernes Tuyaux de données de données de données STRUCTURE SUR LES SORTIES DONNEES DONNÉES XARGS TRAITES PROCEDUES, Il n'y a pas de cassette tampon unique remplie avant que la recherche soit terminée (c'est la manière dont les tuyaux dans MSDOS utilisaient). Pour tester cela, passez simplement à / et exécutez la recherche de prendre une note combien de temps il faut pour trouver (ou l'interrompez-vous si vous vous ennuyez). Puis exécutez trouver / | Xargs Vous pouvez facilement voir que les données de xargs sorties de la recherche à l'arrivée.


@ Siku-siku.com, Recherche remplace {} avec le nom du fichier actuel.


@IVAN, même si xargs reçoit des données dès que rechercher . Il ne peut pas exécuter la commande avant d'avoir tous les arguments. Pour que cela se produise, trouver doit finir de leur envoyer.



-1
votes

À peu près sûr que c'est le seul moyen. Vous devrez rédolter chaque dossier, puis par le biais de chaque sous-dossier et vérifier chaque fichier.
Seule une autre chose que je peux penser, c'est dans le code du serveur lancer le répertoire et la structure de fichier dans une requête LINQ, puis vous pouvez faire une requête de type SQL. Mais alors le serveur va finir par faire à peu près la même chose.


0 commentaires

3
votes

Vous n'étant pas sûr qu'entendez-vous de mieux, ma première pensée était quelque chose comme ceci: xxx

mais c'est pire car le résultat de la recherche serait accumulé quelque part dans la mémoire des coquilles puis envoyé comme une énorme morceaux d'arguments d'entrée

Le seul impactement que je vois aussi votre suggestion est xxx

de cette façon, trouver effectue tout le filtrage et vous conservez toujours le traitement de la canalisation


0 commentaires

2
votes

Si cela va être un utilitaire de recherche commun que vous allez utiliser, vous voudrez peut-être jeter un coup d'œil à ACK , qui combine à la fois le trouver et le grep ensemble dans cette fonctionnalité que vous recherchez. Il a moins de fonctionnalités que grep , bien que 99% de mes recherches soient parfaitement adaptées en remplaçant toutes les instances de grep avec ack .

Outre Les autres réponses données, je suggère également cette construction: xxx Encore mieux, si les noms de fichiers ont des espaces d'entre eux, vous pouvez soit indiquer "nom de fichier" ou passer une résiliation null (au lieu de la résiliation non terminée) résultant de trouver à < Code> xargs , puis avoir xargs strogner eux-mêmes: xxx

ici, le nom nom de fichier peut réellement être quelque chose, mais il doit correspondre à la fois xxx Comme ça: xxx

Il fait essentiellement la même chose que le {} utilisé dans le Recherche déclaration elle-même d'indiquer "la ligne de texte que cela revint". Sinon, Xargs vient d'aborde les résultats de à la fin de toutes les commandes que vous le donnez (qui ne vous aide pas beaucoup si vous voulez grep pour rechercher à l'intérieur un fichier, qui est généralement spécifié dernier sur la ligne de commande).


0 commentaires