web-dev-qa-db-fra.com

Comment exclure des liens symboliques dans un grep?

Je veux grep -R Un répertoire mais exclure les liens symboliques comment faire?

Peut-être quelque chose comme grep -R --no-symlinks Ou quelque chose?

Merci.

40
Drew LeSueur

Gnu grep v2.11-8 et plus si invoqué avec -rexclut les liens symboliques non spécifié sur la ligne de commande et les inclut lorsqu'il est appelé avec -R.

59
Aryeh Leib Taurog

Si vous connaissez déjà le nom des liens symboliques que vous souhaitez exclure:

grep -r --exclude-dir=LINK1 --exclude-dir=LINK2 PATTERN .

Si le (s) nom (s) des liens symboliques varient, excluez peut-être d'abord les liens symboliques avec une commande find, puis grep les fichiers générés:

find . -type f -a -exec grep -H PATTERN '{}' \;

Le '-H' à grep ajoute le nom de fichier à la sortie (qui est la valeur par défaut si grep recherche récursivement, mais n'est pas là, où grep reçoit des noms de fichiers individuels.)

Je souhaite généralement modifier grep pour exclure les répertoires de contrôle de source. Cela est plus efficacement fait par la commande find initiale:

find . -name .git -Prune -o -type f -a -exec grep -H PATTERN '{}' \;
15
Jonathan Hartley

Pour l'instant .. voici comment je voudrais exclure les liens symboliques lors de l'utilisation de grep


Si vous voulez juste des noms de fichiers correspondant à votre recherche:

for f in $(grep -Rl 'search' *); do if [ ! -h "$f" ]; then echo "$f"; fi; done;

Explication:

  • grep -R # recursive
  • grep -l # file names only
  • if [ ! -h "file" ] # bash if not a symbolic link

Si vous voulez la sortie du contenu correspondant, que diriez-vous d'un double grep:

srch="whatever"; for f in $(grep -Rl "$srch" *); do if [ ! -h "$f" ]; then
  echo -e "\n## $f";
  grep -n "$srch" "$f";
fi; done;

Explication:

  • echo -e # enable interpretation of backslash escapes
  • grep -n # adds line numbers to output

.. Ce n'est pas parfait bien sûr. Mais cela pourrait faire le travail!

5
bksunday

Si vous utilisez un grep plus ancien qui n'a pas le comportement -r décrit dans la réponse d'Aryeh Leib Taurog, vous pouvez utiliser une combinaison de find, xargs et grep:

find . -type f | xargs grep "text-to-search-for"
3
Brenda Bell