我想grep -R
一个目录但排除符号链接我该怎么办?
可能像grep -R --no-symlinks
之类的东西?
谢谢。
答案 0 :(得分:54)
如果在命令行中未指定-r
v2.11-8 and on调用Gnu grep excludes symlinks,则在使用-R
调用时包含它们。
答案 1 :(得分:14)
如果您已经知道要排除的符号链接的名称:
grep -r --exclude-dir=LINK1 --exclude-dir=LINK2 PATTERN .
如果符号链接的名称不同,可以先用find命令排除符号链接,然后grep输出的文件:
find . -type f -a -exec grep -H PATTERN '{}' \;
' -H' to grep将文件名添加到输出中(如果grep以递归方式搜索,则这是默认值,但不在此处,grep将被传递给单个文件名。)
我通常想修改grep以排除源控制目录。初始查找命令最有效地完成了这项工作:
find . -name .git -prune -o -type f -a -exec grep -H PATTERN '{}' \;
答案 2 :(得分:5)
目前..以下是在使用grep时排除符号链接的方法
如果您只想要与搜索匹配的文件名:
for f in $(grep -Rl 'search' *); do if [ ! -h "$f" ]; then echo "$f"; fi; done;
解释:
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;
解释:
echo -e # enable interpretation of backslash escapes
grep -n # adds line numbers to output
..当然不完美。但它可以完成工作!
答案 3 :(得分:2)
如果你使用的是没有Aryeh Leib Taurog答案中描述的-r行为的旧grep,你可以使用find
,xargs
和grep
的组合:
find . -type f | xargs grep "text-to-search-for"