执行运行多个输入文件的程序的 Shell 脚本

执行运行多个输入文件的程序的 Shell 脚本

我是 shell 脚本新手,因此我正在寻求帮助。

我有一个程序,它接受两个参数输入文件名和输出文件名。

我有多个具有不同名称的数据文件。我想编写一个shell脚本来对所有数据文件执行该程序,这样每个文件都会被单独处理。

对于每个输出文件,名称应该是输入文件的名称,以-s表明它是一个解决方案文件。除了 应该-s附加名称的基本部分,这样就file.txt变成了file-s.txt

编辑:感谢所有回复者,问题与此类似这里 不同之处在于,我不在 MS VS 上,或者对 C++ 代码都没有问题,并且我想在工作站上同时(并发)处理所有数据(数千个 .txt 文件)

答案1

您可以使用GNU Parallel程序来实现:

find . -name \*.txt | grep -v -e '\-s.txt$' | parallel echo program "{}" {.}-s.txt
program ./1 2.txt ./1 2-s.txt
program ./aaa.txt ./aaa-s.txt
program ./bbb.txt ./bbb-s.txt
program ./demo.txt ./demo-s.txt
program ./original_names.txt ./original_names-s.txt

答案2

看来你想要这样的东西:

for src; do
  dst="${src%.txt}-s.txt"
  program "$src" "$dst"
done

使用要处理的文件的名称调用脚本。关键部分是"${src%.txt}-s.txt",它删除了.txt扩展并添加了-s.txt.

答案3

假设您当前使用两个参数调用程序cmd input-file output-file,您可以简单地将包装器脚本编写为:

#!/bin/sh
for file; do 
    output="${file%.txt}"-s.txt
    cmd "$file" "$output" &
done

然后使用多个输入作为参数调用脚本。该解决方案假设您的输入文件都有.txt后缀(好吧,它并没有真正假设这一点,但如果没有,输出文件名将会很奇怪)。请注意,这可能会覆盖现有的输出文件;如果您担心的话,添加一些逻辑来检查先前的存在。创建一个目录并将所有输出文件放入一个新目录中以避免该问题可能更安全。或者,如果您想从输入读取文件名:(例如,您可以使用 调用脚本< my-file-full-of-input-files-one-per-line ./my-script),请将其写为:

#!/bin/sh
while read file; do
    output="${file%.txt}"-s.txt
    cmd "$file" "$output" &
done

相关内容