Je suis en train de parcourir une grande pile de code gérée par git, et chaque fois que je fais une grep, je vois des tas et des tas de messages de la forme:
> grep pattern * -R -n
whatever/.git/svn: No such file or directory
Existe-t-il un moyen de faire disparaître ces lignes?
ag
,ack
ou à lacgrep
place - ils sont beaucoup plus rapides / meilleurs quegrep
pour rechercher des référentiels de code.No such file or directory
messages pour des fichiers et / ou des répertoires existants? Ou, inversement, commentgrep *
obtenir des noms de fichiers qui n'existent pas? S'agit-il d'une condition de concurrence critique, où un autre processus manipule l'arborescence de répertoires (création, renommage et suppression de fichiers) pendant l'grep
exécution de?Réponses:
Vous pouvez utiliser l' indicateur
-s
ou--no-messages
pour supprimer les erreurs.la source
/bin/ls -1 | xargs grep 'some text'
vous donnera "aucun fichier ou répertoire" car elle décompose 'a b.txt' en 2 arguments. Si vous supprimez, vous ne remarquerez pas que vous avez manqué un fichier.find
et utiliseprint0
avecxargs -0
Est-ce que cela résout le problème? MerciSi vous parcourez un référentiel git, je vous recommande d'utiliser
git grep
. Vous n'avez pas besoin de passer-R
ni le chemin.Cela affichera toutes les correspondances de votre répertoire actuel.
la source
Ggrep
recherche également à partir du haut du répertoire Git au lieu du répertoire actuel.De telles erreurs sont généralement envoyées au flux "erreur standard", que vous pouvez diriger vers un fichier ou simplement faire disparaître sur la plupart des commandes:
la source
J'ai vu cela se produire plusieurs fois, avec des liens brisés (liens symboliques pointant vers des fichiers qui n'existent pas), grep essaie de rechercher sur le fichier cible, qui n'existe pas (d'où le message d'erreur correct et précis).
Normalement, je ne me dérange pas en effectuant des tâches sysadmin sur la console, mais à partir de scripts, je cherche des fichiers texte avec "find", puis grep chacun:
Au lieu de:
la source
Je ne laisse généralement pas grep faire la récursivité elle-même. Il y a généralement quelques répertoires que vous souhaitez ignorer (.git, .svn ...)
Vous pouvez faire des alias intelligents avec des positions comme celle-ci:
Cela peut sembler exagéré à première vue, mais lorsque vous devez filtrer certains modèles, c'est assez pratique.
la source
-exec
avant avant votre grep.\( -name .svn -o -name .git \)
Avez-vous essayé l'
-0
option dans xargs ? Quelque chose comme ça:la source
find -print0 | xargs -0 grep 'text'
Utilisation
-I
dans grep.Exemple:
grep SEARCH_ME -Irs ~/logs
.la source
-I
ignore les fichiers binaires - c'est équivalent à--binary-files=without-match
. Cependant, il ne supprime pas les messages "Aucun fichier ou répertoire".Je redirige
stderr
versstdout
, puis j'utilise invert-match (-v
) de grep pour exclure la chaîne d'avertissement / d'erreur que je souhaite masquer:la source