我试图运行下面的命令:

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top