【发布时间】:2014-09-18 16:49:15
【问题描述】:
我认为xargs 是UNIX shell 的映射函数。 filter 函数是什么?
编辑:看来我必须更明确一点。
假设我必须处理一个接受单个字符串作为参数并返回退出代码 0 或 1 的程序。该程序将充当它接受的字符串的谓词。
例如,我可能决定将字符串参数解释为文件路径,并将谓词定义为“此文件是否存在”。在这种情况下,程序可以是test -f,给定一个字符串,如果文件存在则以 0 退出,否则以 1 退出。
我还必须交出一串字符串。例如,我可能有一个文件 ~/paths 包含
/etc/apache2/apache2.conf
/foo/bar/baz
/etc/hosts
现在,我想创建一个新文件 ~/existing_paths,其中仅包含我的文件系统中存在的那些路径。在我的情况下,那将是
/etc/apache2/apache2.conf
/etc/hosts
我想通过读入~/paths 文件、通过谓词test -f 过滤这些行并将输出写入~/existing_paths 来做到这一点。与xargs 类比,如下所示:
cat ~/paths | xfilter test -f > ~/existing_paths
这是我正在寻找的假设程序xfilter:
xfilter COMMAND [ARG]...
对于其标准输入的每一行L,将调用COMMAND [ARG]... L,如果退出代码为0,则打印L,否则不打印任何内容。
明确地说,我不是在寻找:
- 一种按存在过滤文件路径列表的方法。这是一个具体的例子。
- 如何编写这样的程序。我可以做到。
我我正在寻找:
- 预先存在的实现,例如
xargs,或 - 清楚地解释为什么不存在
【问题讨论】:
-
因为无效fork N 次命令只会根据退出状态进行归档。正如您所说,用任何语言(bash、perl、C)编写都很简单——但效果不佳。更有效的是直接使用一些命令(正确的工具 - 基于情况)可以读取 STDIN 和 过滤输入 为 zilion 次 fork/exec 退出状态命令。很多时候
xargs也不是最有效的方法。 (想象一个长 1_000_000 行的文件列表。Milion forks 并不是你能做的最好的事情......)如果需要这样的东西(如你所知),它是一个 3 行 bash 函数 -
@jm666 听起来“有效”是指“表现出色”。我不在乎表现,我在乎表现力。