题
我试图运行下面的命令:
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
其中“foobar的”是别名或在我的.bashrc文件定义的函数(在我的情况下,它是一个函数,它有一个参数)。显然xargs的不承认这些东西因为它可以运行。有一个聪明的办法来解决这个问题?
解决方案
因为只有你的交互shell知道别名,为什么不干脆不通过xargs
分叉运行别名?
find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done
如果你确定你的文件名没有在他们换行符(益,为什么他们会?),可以简化为
find . -iname '.#*' -print | while read -r i; do foobar "$i"; done
甚至只是find -iname '.#*' | ...
,由于默认的目录是.
和默认动作是-print
。
一个以上替代:
IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done
告诉击该词语是仅在分裂换行符(默认值:IFS=$' \t\n'
)。你应该小心一点,虽然,一些脚本不具有改变$IFS
应付良好。
其他提示
使用bash也可指定被传递到您的别名(或功能)args来数,像这样:
alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "$@"' arg0
此不起作用,因为xargs
希望能够exec
的程序给出作为它的参数。
由于foobar
你的情况只是一个bash
别名或函数没有程序来执行。
虽然它涉及到开始由bash
返回的每个文件find
,你可以这样写一个小的shell脚本:
#!/bin/bash
. $(HOME)/.bashrc
func $*
和然后传递脚本的名称作为参数传递给xargs
我通常使用找到这样的:
find . -iname '' -exec cmd '{}' \;
'{}' 将被替换为文件名,和\;是必要的,以终止执行链。但是,如果不与你的函数时,您可能需要通过庆典来运行它:
find .. |sed -e "s/.*/cmd '&'/"|bash
查找打印一行的每个文件,sed的只是你的命令前缀这一点,然后通过管道它来砸执行。跳过|。第一个庆典,看看会发生什么。
试
find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)
不隶属于 StackOverflow