如何在grep中排除符号链接?

Dre*_*eur 42 grep

我想要grep -R一个目录,但排除符号链接我如何做到这一点?

也许是什么样的grep -R --no-symlinks东西?

谢谢.

Ary*_*rog 60

Gnu grep v2.11-8和on如果调用,则-r 排除未在命令行中指定的符号链接,并在调用时包含它们-R.


Jon*_*ley 15

如果您已经知道要排除的符号链接的名称:

grep -r --exclude-dir=LINK1 --exclude-dir=LINK2 PATTERN .
Run Code Online (Sandbox Code Playgroud)

如果符号链接的名称不同,可以首先使用find命令排除符号链接,然后grep输出的文件:

find . -type f -a -exec grep -H PATTERN '{}' \;
Run Code Online (Sandbox Code Playgroud)

grep的'-H'将文件名添加到输出中(如果grep正在递归搜索,则这是默认值,但不在此处,grep正在递送单个文件名.)

我通常想修改grep以排除源控制目录.初始查找命令最有效地完成了这项工作:

find . -name .git -prune -o -type f -a -exec grep -H PATTERN '{}' \;
Run Code Online (Sandbox Code Playgroud)

  • 另一种选择是`grep PATTERN $(find -type f)`.哪个更可读,也可能更慢. (3认同)

bks*_*day 5

现在..这是我在使用grep时排除符号链接的方法


如果您只想要与您的搜索匹配的文件名:

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

阐释:

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

如果你想要匹配的内容输出,那么双grep怎么样:

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

阐释:

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

..当然不是完美的.但它可以完成工作!