我正在尝试查找一些文件并且我已经为它编写了一个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
答案 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...
编辑抱歉,当你看到这种状况时,这种状况很容易混淆......