Il doit y avoir une meilleure façon de faire cela: aussi, pour rechercher uniquement par exemple. Fichiers HTML: P> # find . | grep html$ | xargs grep <string-to-find>
4 Réponses :
find . -name \*.html -exec grep -H string-to-find {} \;
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 code> remplace
{} code> avec le nom du fichier actuel.
@IVAN, même si xargs code> reçoit des données dès que
rechercher code>. Il ne peut pas exécuter la commande avant d'avoir tous les arguments. Pour que cela se produise,
trouver code> doit finir de leur envoyer.
À 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. P>
Vous n'étant pas sûr qu'entendez-vous de mieux, ma première pensée était quelque chose comme ceci: 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 p> Le seul impactement que je vois aussi votre suggestion est p> de cette façon, trouver effectue tout le filtrage et vous conservez toujours le traitement de la canalisation p> p>
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 Outre Les autres réponses données, je suggère également cette construction:
ici, le nom Il fait essentiellement la même chose que le trouver code> et le
grep code> ensemble dans cette fonctionnalité que vous recherchez. Il a moins de fonctionnalités que
grep code>, bien que 99% de mes recherches soient parfaitement adaptées en remplaçant toutes les instances de
grep code> avec
ack code>.
"nom de fichier" code> ou passer une résiliation null (au lieu de la résiliation non terminée) résultant de
trouver code> à < Code> xargs code>, puis avoir
xargs code> strogner eux-mêmes:
nom de fichier code> peut réellement être quelque chose, mais il doit correspondre à la fois
{} code> utilisé dans le
Recherche code> déclaration elle-même d'indiquer "la ligne de texte que cela revint". Sinon, Xargs vient d'aborde les résultats de
code> à la fin de toutes les commandes que vous le donnez (qui ne vous aide pas beaucoup si vous voulez
grep code> pour rechercher à l'intérieur un fichier, qui est généralement spécifié dernier i> sur la ligne de commande). p> p>
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 code> avec
xargs code> 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 code> dans
Inclure / linux / limites.h code>
dans le noyau Linux, et il a une valeur par défaut de131072 code>.
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 code> 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 code> doit exécuter une commande avec un million d'arguments (ce qu'il a reçu de
stdin code>), le système d'exploitation se plaint.
@Ivan, aussi,
xargs code> n'exécute pas la commande avec chaque argument. Il compile une liste de tous les arguments et alors i> 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 I> 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 :).