xargs不能识别bash别名

我试图运行以下命令:

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 

如果你确定你的文件名没有换行符(ick,为什么他们?),你可以简化为

 find . -iname '.#*' -print | while read -ri; do foobar "$i"; done 

甚至只是find -iname '.#*' | ... find -iname '.#*' | ... ,因为默认目录是. 而默认的操作是-print

另一个select:

  IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done 

告诉Bash单词只在换行符上分割(默认: IFS=$' \t\n' )。 不过,你应该小心一点, 一些脚本不能很好地处理更改的$IFS

使用Bash,你也可以指定传递给别名(或函数)的参数数目,如下所示:

 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别名或function没有程序来执行。

虽然它涉及到由find返回的每个文件的开始bash ,您可以编写一个小的shell脚本:

 #!/bin/bash . $(HOME)/.bashrc func $* 

然后将该脚本的名称作为parameter passing给xargs

我通常使用这样的发现:

 find . -iname '' -exec cmd '{}' \; 

“{}”将被replace为文件名,而\ 有必要终止执行链。 但是,如果这不适用于你的函数,你可能需要通过bash运行它:

 find .. |sed -e "s/.*/cmd '&'/"|bash 

查找打印每一个文件在一行,sed只是用你的命令前缀,然后pipe它打到执行。 先跳过bash,看看会发生什么。