我的.aliases中有以下别名:
alias gi grep -i
我希望在名称中包含字符串foo
的所有文件中不区分大小写bar
:
find -name \*bar\* | xargs gi foo
这就是我得到的:
xargs: gi: No such file or directory
有没有办法在xargs中使用别名,或者我是否必须使用完整版本:
find -name \*bar\* | xargs grep -i foo
注意:这是一个简单的例子。除了gi
我还有一些非常复杂的别名,我无法轻易手动扩展。
修改:我使用了tcsh
,因此请指明答案是否是特定于shell的。
答案 0 :(得分:28)
别名是特定于shell的 - 在这种情况下,很可能是特定于bash的。要执行别名,您需要执行bash,但只为交互式shell加载别名(更准确地说,只有交互式shell才会读取.bashrc
。)
bash -i 运行交互式shell(和源.bashrc)。 bash -c cmd 运行 cmd 。
把它们放在一起:
bash -ic cmd 在交互式shell中运行 cmd ,其中 cmd 可以是在其中定义的bash函数/别名你的.bashrc
。
find -name \*bar\* | xargs bash -ic gi foo
应该做你想做的事。
编辑:我发现您已将问题标记为“tcsh”,因此特定于bash的解决方案不适用。使用tcsh,您不需要-i
,因为它似乎会读取.tcshrc,除非您提供-f
。
试试这个:
find -name \*bar\* | xargs tcsh -c gi foo
它适用于我的基本测试。
答案 1 :(得分:7)
将“gi”改为剧本
例如,在/home/$USER/bin/gi
中:
#!/bin/sh
exec /bin/grep -i "$@"
不要忘记标记文件的可执行文件。
答案 2 :(得分:6)
建议here是为了避免xargs并使用“while read”循环而不是xargs:
find -name \*bar\* | while read file; do gi foo "$file"; done
请参阅上面链接中的已接受答案,以了解处理文件名中的空格或换行符的改进。
答案 3 :(得分:5)
在bash中,此解决方案非常适合我:
https://unix.stackexchange.com/a/244516/365245
问题
[~]: alias grep='grep -i'
[~]: find -maxdepth 1 -name ".bashrc" | xargs grep name # grep alias not expanded
[~]: ### no matches found ###
解决方案
[~]: alias xargs='xargs ' # create an xargs alias with trailing space
[~]: find -maxdepth 1 -name ".bashrc" | xargs grep name # grep alias gets expanded
# Name : .bashrc
为什么起作用
[~]: man alias
alias: alias [-p] [name[=value] ... ]
(snip)
A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.
答案 4 :(得分:0)
对于tcsh(没有功能),您可以使用:
gi foo `find -name "*bar*"`
对于bash / ksh / sh,您可以在shell中创建一个函数。
function foobar
{
gi $1 `find . -type f -name "*"$2"*"`
}
foobar foo bar
请记住,在shell中使用反引号比从多个视角使用xargs更有利。将函数放在.bashrc中。
答案 5 :(得分:0)
使用Bash你也可以指定传递给你的别名(或函数)的args数量,如下所示:
alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
(应该以类似的方式为tcsh工作)
# alias definition in ~/.tcshrc
echo arg1 arg2 | xargs -n 1 tcsh -cim 'myFuncOrAlias "$1"' arg0 # untested
答案 6 :(得分:0)
最简单的解决方案是扩展别名内联。但这仅对csh / tcsh有效。
find -name \*bar\* | xargs `alias gi` foo
对于bash来说,它会比较棘手,虽然不那么方便,但仍然可能有用:
find -name \*bar\* | xargs `alias gi | cut -d "'" -f2` foo