我是 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