【发布时间】:2017-04-18 03:03:42
【问题描述】:
我经常使用find 在巨大的源代码树中搜索文件和符号。如果我不限制目录和文件类型,在文件中搜索符号需要几分钟。 (我已经将源代码树安装在 SSD 上,这将搜索时间减半。)
我有几个别名来限制我要搜索的目录,例如:
alias findhg='find . -name .hg -prune -o'
alias findhgbld='find . \( -name .hg -o -name bld \) -prune -o'
alias findhgbldins='find . \( -name .hg -o -name bld -o -name install \) -prune -o'
然后我也限制文件类型,例如:
findhgbldins \( -name '*.cmake' -o -name '*.txt' -o -name '*.[hc]' -o -name '*.py' -o -name '*.cpp' \)
但有时我只想检查 cmake 文件中的符号:
findhgbldins \( -name '*.cmake' -o -name '*.txt' \) -exec egrep -H 'pattern' \;
我可以为所有可能的组合创建一大堆别名,但如果我可以使用变量来选择文件类型会容易得多,例如:
export SEARCHALL="\( -name '*.cmake' -o -name '*.txt' -o -name '*.[hc]' -o -name '*.py' -o -name '*.cpp' \)"
export SEARCHSRC="\( -name '*.[hc]' -o -name '*.cpp' \)"
然后调用:
findhgbldins $SEARCHALL -exec egrep -H 'pattern' \;
我尝试了几种转义\、(、* 和) 的变体,但没有一种组合有效。
我可以让它工作的唯一方法是关闭 Bash 中的 globbing,即 set -f,然后调用我的“查找”装置,然后再次打开 globbing。
我想出的一个替代方法是定义一组函数(与我的别名 findhg、findhgbldins 和 findhgbldins 具有相同的名称),它们采用在 @987654335 中使用的简单参数@ 选择我正在寻找的不同文件类型的结构,例如:
findhg {
case $1 in
'1' )
find <many file arguments> ;;
'2' )
find <other file arguments> ;;
...
esac
}
findhgbld {
case $1 in
'1' )
find <many file arguments> ;;
'2' )
find <other file arguments> ;;
...
esac
}
etcetera
我的问题是:是否可以将这些类型的参数作为变量传递给命令?
或者是否有不同的方法来实现相同的目标,即结合命令(findhg、findhgbld、findhgbldins)和单个参数来创建大量搜索组合?
【问题讨论】:
-
你需要
egrep吗?fgrep会更简单吗?
标签: bash parameter-passing command-line-arguments variable-expansion