我正在尝试根据另一个命令的输出创建多个流程替换,但是我不确定如何实现。
作为示例场景,我给出了文件列表:
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列表是经过硬编码的,因此我的目标是找到某种方式来替代动态数量的命令(例如通配符,usingeval
或xargs
某种方式)。
此处描述了另一种情况。
我对上述问题的特定解决方案(解决方法)不感兴趣,因为这只是一种情况。我对如何在shell中动态创建流程替换感兴趣,或者可以使用哪些其他工具来实现这一点,我很感兴趣。
另请参阅:如何创建匿名FIFO?
动态生成字符串并评估它很容易:
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”结尾的文件名。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句