2016-06-08 56 views
0

我在查找一些文件,并且为它编写了一个bash脚本并以此方式使用它 - ./findme.sh "before",但它不能正常工作。有什么问题? 我如何正确地重写它并更美化?查找除了几个文件夹以外包含字符串的文件

#!/bin/bash 
string=$1 
clear 
find . -name "*.*" ! -path "./node_modules" \ 
     ! -path "./bower_components" \ 
     ! -path "./public_lib/bootstrap" \ 
     ! -path "./public_lib/jquery" \ 
     ! -path "./public_lib/lib/bootstrap" \ 
     ! -path "./public_lib/lib/jquery" \ 
-print | xargs grep -o -r -n -C 3 --color=auto "$string" ./ 

echo "Search end!" 
exit 0 
+1

你到底想干什么?搜索目录中的所有文件以获取模式? – andlrc

+0

我试图: 1.按内容递归搜索文件 2.排除指定的文件夹 3.以格式“path/file_name:line_number” –

回答

1

就可以正常使用grep这个:

#!/bin/bash 
grep -rnC 3 --color=auto \ 
    --exclude-dir={node_modules,bower_components} \ 
    --exclude-dir=public_lib/{,lib/}{bootstrap,jquery} -- "$1" . 

这将搜索所有文件的递归和$1行号显示和三线上面和下面的比赛。

如果你想遵循符号链接,你应该使用-R而不是-r

--exclude-dir={node_modules,bower_components}使用支具扩张和将扩大到:

--exclude-dir=node_modules --exclude-dir=bower_components 

而且更先进的--exclude-dir=public_lib/{,lib/}{bootstrap,jquery},将扩大到:

--exclude-dir=public_lib/bootstrap --exclude-dir=public_lib/jquery \ 
--exclude-dir=public_lib/lib/bootstrap --exclude-dir=public_lib/lib/jquery 

反斜杠和换行符增加了澄清。

+0

格式显示找到(仅匹配)不起作用。这我已经得到了我的脚本http://imgur.com/Ga8qJuW(忽略排除的dirs)和这个 - 你的http://imgur.com/mxJangf –

+0

@ValSaven我省略了'-o',因为它会提取比赛并没有显示全线。 – andlrc

0

根据查找手册页,您必须指定您不想匹配的完整文件名,例如, (如果它变得更深),或者使用修剪,例如, \(\(-path "./node_modules" -prune \) -o ...,在这种情况下,您必须使用-o将​​每个路径排除,例如,

find . -name "*.*" \( -path "./node_modules" -prune \) -o \ 
     \( -path "./bower_components" -prune \) -o \ 
     \( -path "./public_lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/jquery" -prune \) -o \ 
     \( -path "./public_lib/lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/lib/jquery" -prune \) -o \ 
-print | xargs... 

编辑对不起,你看到的情况很容易弄乱了......

+0

可能简化为'\(-path ... -o -path .... -o path ... \)-prune -o -name“*。*”-print | xargs ...',因为上面实际上是'-name“*。*”-a \(-path“./node_modules”-prune \)','-a'的优先级高于'-o'。 – BroSlow

相关问题