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.
Gnu grep v2.11-8 et plus si invoqué avec -r
exclut les liens symboliques non spécifié sur la ligne de commande et les inclut lorsqu'il est appelé avec -R
.
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 '{}' \;
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!
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"