La tuyauterie de trouver des résultats dans grep rapide du répertoire d'exclusion
Je suis avec succès à l'aide de la recherche pour créer une liste de tous les fichiers dans le sous-répertoire actuel, à l'exclusion de celles dans le sous-répertoire "cache". Voici mon premier bout de code:
find . -wholename './cach*' -prune -o -print
Je souhaite maintenant pipe en une commande grep. Il semble que ce devrait être simple:
find . -wholename './cach*' -prune -o -print | xargs grep -r -R -i "samson"
... mais c'est le retour des résultats qui sont pour la plupart du répertoire de cache. J'ai essayé de supprimer les xargs de référence, mais qu'est-ce que vous attendez, l'exécution de la commande grep sur le texte des noms de fichiers, plutôt que sur les fichiers eux-mêmes. Mon objectif est de trouver des "samson" dans tous les fichiers qui ne sont pas mis en cache de contenu.
Je vais probablement contourner ce problème en utilisant simplement doublé grep dans ce cas, mais je suis très curieux de savoir pourquoi ce one-liner se comporte de cette manière. J'aimerais entendre les pensées sur une manière de le modifier tout en continuant d'utiliser ces deux commandes (comme il y a de la vitesse d'avantages à le faire de cette façon).
(C'est dans CentOS 5, btw.)
OriginalL'auteur eternalnewb | 2012-07-19
Vous devez vous connecter pour publier un commentaire.
La
wholename
match peut être la raison pour laquelle il est toujours compris "cache" des fichiers. Si vous êtes à l'exécution de lafind
commande dans le répertoire qui contient le "cache" du dossier, il devrait fonctionner. Si pas, essayez de la modifier à-name '*cache*'
à la place.Aussi, vous n'avez pas besoin de la
-r
ou-R
pour votregrep
, qui lui dit de répéter à travers les répertoires - mais vous êtes de test des fichiers individuels.Vous pouvez mettre à jour votre commande à l'aide de la version courante, ou d'une seule commande:
ou
Note, le
-l
dans la première commande indiquegrep
à la "liste des fichiers" et non pas la ligne(s) qui correspondent. Le-q
dans le deuxième fait de même; il racontegrep
de répondre tranquillement tellementfind
ensuite, il suffit d'imprimer le nom du fichier.find . -wholename './cach*' -prune -o -print | xargs grep -i -I "samson"
Génial, content que ça a été quelque chose de simple =]
OriginalL'auteur newfurniturey
Vous ai dit
grep
lui-même de manière récursive (deux fois!-r
et-R
sont synonymes). Depuis l'un des arguments que vous êtes en passant est.
(le répertoire),grep
est à la recherche dans tous les fichiers (certains d'entre eux, deux fois, ou même plus si ils sont dans des sous-répertoires).Si vous allez utiliser
find
etgrep
, faites ceci:À l'aide de
-print0
et-0
rend votre script fonctionne même avec les noms de fichiers contenant des espaces ou des caractères de ponctuation.Cependant, vous n'avez probablement pas besoin de s'embêter avec
find
ici, puisque GNU grep est capable d'exclure des répertoires:(Ce qui exclut également
./deeply/nested/directory/cache
. Si vous ne voulez exclure les répertoires de cache au niveau supérieur, l'utilisationfind
comme vous l'avez fait.)grep
sera de retour d'une "trop d'arguments" erreur - de sorte que vous devez être prudent avec que par lui-même.Merci pour la capture de ce! Comme mentionné dans le "accepté" en réponse, le nettoyage qui fixe les choses tout de suite. Vous les gars sont super.
Non, un “trop d'arguments” erreur viendrait de la coquille, si la ligne de commande est trop longue (par exemple, si j'avais écrit
grep … *
et il y avait beaucoup de fichiers). Ici, il n'y a pas de coquille d'expansion, la ligne de commande est exactement 43 caractères.OriginalL'auteur Gilles
Utiliser le
-exec
option sur trouver au lieu de la tuyauterie à une autre commande. De là, vous pouvez utilisergrep "samson" {} \;
chercher samson dans chaque fichier listé.Par exemple:
OriginalL'auteur Conner