我在 .zshrc 中定义了一个函数,如下所示:
fdtnxg () {
find $1 -type $2 -name "$3" | xargs grep "${@:4}"
}
如果我想在当前目录中名称以开头的所有文件中使用fdtnxg
grep ,我必须使用.alias mot
tt.
fdtnxg . f "tt.*" "alias mot"
我想fdtnxg . f tt.* alias mot
直接使用,但不能。有没有办法让它按我的预期工作?
我试图改变fdtnxg
为:
fdtnxg () {
find $1 -type $2 -name "\"$3\"" | xargs grep "${@:4}"
}
我试过这个,因为echo "\"123\""
我得到了引号"123"
。
我认为你有两个问题。
首先,您要防止 shell 在运行该函数时使用通配符。您不能通过在函数内添加引号来执行此操作,因为文件名在函数运行之前已扩展为函数的参数。为了防止文件名扩展,运行函数 as
noglob fdtnxg
,可以使用别名 (alias fdtnxg="noglob fdtnxg"
) 自动执行。二是grep的论据。我假设您希望从第四个开始的函数参数连接到 grep 的单个字符串。
"${@:4}"
, 将它们扩展为不同的单词(就像"$@"
所有位置参数一样)。"$*"
而是将参数连接到单个字符串。在 Zsh 中,"${*[4,-1]}"
似乎可以连接第四个和以后的参数。("${*:4}"
将它们全部连接起来并从第四个字符开始,这与 Bash 所做的不同。)如果这不起作用,您总是可以将前三个移出,然后使用"$*"
.所以要么
或者
和
在任何情况下,您都不能像这样通过管道
find
输出xargs
。您需要-print0
/-0
GNU 扩展,或者在这里更好,我们使用标准-exec cmd {} +
查找语法(添加一个/dev/null
参数以确保grep
即使find
只找到一个文件也始终打印文件名;使用 GNUgrep
,您也可以使用该-H
选项) .