我在Bash shell脚本中编写了一个函数,用于在Linux树中搜索与包含正则表达式的模式匹配的文件名,并突出显示颜色:
function ggrep {
LS_="ls --color {}|sed s~./~~"
[ -n "$1" -a "$1" != "*" ] && NAME_="-iname $1" || NAME_=
[ -n "$2" ] && EXEC_="egrep -q \"$2\" \"{}\" && $LS_ && egrep -n \"$2\" --color=always \"{}\"|sed s~^B~\ B~" || EXEC_=$LS_
FIND_="find . -type f $NAME_ -exec sh -c \"$EXEC_\" \\;"
echo -e \\e[7m $FIND_ \\e[0m
$FIND_
}
e.g。 ggrep a*
列出当前目录树下以a
开头的所有文件
和ggrep a* x
以a
开头且包含x
的文件列表
当我运行它时,我得到:
find: missing argument to `-exec'
即使我通过" echo"复制并粘贴线路输出时得到了正确的输出。进入终端。谁能告诉我我做错了什么?
其次,如果ggrep * x
列出包含x
的所有文件,但*
扩展为文件名列表,我需要使用\*
或{{ 1}}而不是。有没有解决的办法?谢谢!
答案 0 :(得分:2)
使用find
而不是\;
终止\\;
命令。
find . -type f $NAME_ -exec sh -c \"$EXEC_\" \;
答案 1 :(得分:1)
eval $FIND_
函数体的最后一行中的对我来说很好。
BASH中的扩展通常不是递归的,因此如果从变量加载命令,则应始终使用" eval"强制重新处理扩展变量,因为它是一个新的输入。通常,在已经展开的字符串中,引号不能正确处理。
对于你的第二个问题,我认为没有令人满意的解决方案。在将shell传递给您控制的任何内容之前,shell将始终展开*。您可以禁用此扩展,但这是全局设置。无论如何,我认为这种扩展实际上可能有利于你的功能。考虑以利用它的方式重写它。 (我没有分析当前版本是否与此接近。)