如何根据输入(多个 FIFO)创建动态流程替换?

如何根据输入(多个 FIFO)创建动态流程替换?

我正在尝试根据其他命令的输出创建多个进程替换,但是我不确定如何实现这一点。

作为示例场景,我给出了文件列表:

touch a.txt b.txt c.txt d.doc e.doc f.pdf g.pdf h.xls i.xls

我正在做可用文件扩展名列表:

ls -1 *.* | awk -F. '{if (NF>1) {print $NF}}' | sort | uniq

然后根据我的动态列表,我想创建以下 FIFO,例如:

pr -mt <(ls -1 *.doc) <(ls -1 *.pdf) <(ls -1 *.txt) <(ls -1 *.xls)

这将允许我在不同的列中打印每组。然而,上面的 FIFO 列表是硬编码的,因此我的目标是找到某种方法来替代动态数量的命令(例如通配符、使用evalxargs某种方式)。

另一种情况描述于这里

我对上述问题的具体解决方案(解决方法)不感兴趣,因为这只是一种情况。我感兴趣的是如何在 shell 中动态创建进程替换,或者我可以使用哪些其他工具来实现这一目标。

也可以看看:如何创建匿名先进先出?

答案1

动态构建字符串并评估它很容易:

eval "$(echo -n 'pr -mt '; while read ext; do echo "<(ls -1 *.$ext)"; done < list  |tr '\n' ' ' )"

其中list代表您要从中构建命令的扩展列表的文件(可能是 fifo)。

<()本质上是创建未命名的 FIFO。一种无需评估的替代方案可能是使用命名的:

while read ext; do mkfifo ${ext}.pipe; ls -1 *.$ext > ${ext}.pipe & done
pr -mt *.pipe
rm *.pipe  #remove the named pipes when done

上面假设您的目录中没有其他以“.pipe”结尾的文件名。

相关内容