我遇到了一个shell脚本问题,在该脚本中,我给了一个充满输入文件的目录(每个文件包含许多输入行),我需要单独处理它们,将它们的每个输出重定向到唯一文件(又名file_1.input需要)。在file_1.output中捕获,依此类推)。
Pre-parallel之前,我将遍历目录中的每个文件并执行我的命令,同时使用某种计时器/计数技术以免使处理器不堪重负(假设每个进程的运行时间恒定)。但是,我知道情况并非总是如此,因此使用类似“并行”的解决方案似乎是无需编写自定义代码即可获得Shell脚本多线程的最佳方法。
尽管我已经想到了一些方法来并行处理这些文件(并允许我高效地管理内核),但它们似乎都是很棘手的。我有一个非常简单的用例,因此希望尽可能保持整洁(并且并行示例中的任何内容似乎都不是我的问题。
任何帮助,将不胜感激!
输入目录示例:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
脚本:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
更新:阅读下面Ole的答案后,我能够将缺少的部分放到我自己的并行实现中。尽管他的回答很好,但以下是我的补充研究和记录:
我没有执行我的整个过程,而是从概念验证命令开始,以证明他在我的环境中的解决方案。请参阅我的两个不同的实现(和注释):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
使用find(不是ls,这可能会导致问题)在我的输入文件目录中找到所有适用的文件,然后将其内容重定向到单独的目录和文件。我上面的问题是阅读和重定向(实际脚本很简单),因此用cat替换脚本是一个很好的概念证明。
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
第二种解决方案使用parallel的输入变量范例读取文件,但是对于新手来说,这更令人困惑。对我来说,使用find和pipe可以满足我的需求。