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