我正在尝试根据其他命令的输出创建多个进程替换,但是我不确定如何实现这一点。
作为示例场景,我给出了文件列表:
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 列表是硬编码的,因此我的目标是找到某种方法来替代动态数量的命令(例如通配符、使用eval
或xargs
某种方式)。
另一种情况描述于这里。
我对上述问题的具体解决方案(解决方法)不感兴趣,因为这只是一种情况。我感兴趣的是如何在 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”结尾的文件名。