查找包含几个文件夹以外的字符串的文件

时间:2016-06-08 09:05:37

标签: linux bash search grep find

我正在尝试查找一些文件并且我已经为它编写了一个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

2 个答案:

答案 0 :(得分: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

添加反斜杠和换行符以澄清。

答案 1 :(得分:0)

根据查找联机帮助页,您必须指定不想匹配的完整文件名,例如: ! -path "./node_modules/*" ! -path "./node_modules/*/*"(等等,如果它更深)或使用修剪,例如\( \( -path "./node_modules" -prune \) -o ...,在这种情况下,你必须为每个要被排除的路径用-o分隔一个大的OR,例如。

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...

编辑抱歉,当你看到这种状况时,这种状况很容易混淆......