gpt4 book ai didi

shell - 如果xargs是map,那么filter是什么?

转载 作者:行者123 更新时间:2023-12-02 16:20:35 24 4
gpt4 key购买 nike

我认为xargs是UNIX shell的map函数。什么是过滤器功能?

编辑:看起来我必须更明确一点。

假设我必须提供一个接受单个字符串作为参数并返回退出代码 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 过滤这些行并将输出写入 ~ 来完成此操作/现有路径。与 xargs 类比,这看起来像:

cat ~/paths | xfilter test -f > ~/existing_paths

这是我正在寻找的假设程序xfilter:

xfilter COMMAND [ARG]...

对于其标准输入的每一行L,将调用COMMAND [ARG]...L,如果退出代码为0,则打印L,否则什么也不打印。

需要明确的是,我不是在寻找:

  • 一种按存在性过滤文件路径列表的方法。这是一个具体的例子。
  • 如何编写这样的程序。我能做到。

正在寻找:

  • 预先存在的实现,例如 xargs
  • 明确解释为什么不存在

最佳答案

如果 map 是xargs,过滤器是...仍然是xargs

示例:列出当前目录下的文件并过滤掉不可执行的文件:

ls | xargs -I{} sh -c "test -x '{}' && echo '{}'"

这可以通过(非生产就绪)功能变得方便:

xfilter() {
xargs -I{} sh -c "$* '{}' && echo '{}'"
}
ls | xfilter test -x

或者,您可以通过 GNU Parallel 使用并行过滤器实现:

ls | parallel "test -x '{}' && echo '{}'"

关于shell - 如果xargs是map,那么filter是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24979323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com