使用shell将程序应用于数千个文件
直到现在我才使用shell脚本,所以我在做我想要的事情时遇到了困难。我有大约5000个fits文件,我想应用一个名为Spexxy的程序 必须在终端中调用程序Spexxy,如下所示:使用shell将程序应用于数千个文件,shell,Shell,直到现在我才使用shell脚本,所以我在做我想要的事情时遇到了困难。我有大约5000个fits文件,我想应用一个名为Spexxy的程序 必须在终端中调用程序Spexxy,如下所示: Spexxy config.yaml file.fits parallel spexxy {.}.yaml {} ::: *fits parallel --dry-run spexxy {.}.yaml {} ::: *fits find . -maxdepth 1 -name \*fits -print0 |
Spexxy config.yaml file.fits
parallel spexxy {.}.yaml {} ::: *fits
parallel --dry-run spexxy {.}.yaml {} ::: *fits
find . -maxdepth 1 -name \*fits -print0 | parallel -0 spexxy {.}.yaml {}
使用config.yaml
将配置应用于fits文件
最大的问题是,我必须将此程序应用于我的~5000个文件,但每个fits文件都有一个特定的config.yaml文件
我怎样才能意识到这一点?谢谢
编辑:
因此,为了回答第一条注释中的几个问题,每个config.yaml
文件都以其应用于的光谱(fits文件)命名,例如:
ngc6397id000000002jd2456871p6250f000.fits
ngc6397id000000002jd2456871p6250f000.yaml
所有这些文件都位于同一个目录中,以使其更简单
此外,实际上,Spexxy可以使用一个配置yaml文件同时应用于多个fits文件,但在这种情况下,我不使用它,因为每个fits只对应一个yaml文件
我还没有开始写我的代码,因为我正在检查如何在shell中完成这项工作,我对这项工作还很陌生,如果您有一些建议,欢迎使用 看起来像是GNU Parallel的工作,如下所示:
Spexxy config.yaml file.fits
parallel spexxy {.}.yaml {} ::: *fits
parallel --dry-run spexxy {.}.yaml {} ::: *fits
find . -maxdepth 1 -name \*fits -print0 | parallel -0 spexxy {.}.yaml {}
关于语法,您需要知道的是:
是当前文件的占位符{}
是当前文件的占位符,不带扩展名{.}
Spexxy config.yaml file.fits
parallel spexxy {.}.yaml {} ::: *fits
parallel --dry-run spexxy {.}.yaml {} ::: *fits
find . -maxdepth 1 -name \*fits -print0 | parallel -0 spexxy {.}.yaml {}
样本输出
spexxy ngc6397id000000002jd2456871p6250f000.yaml ngc6397id000000002jd2456871p6250f000.fits
spexxy ngc6397id000000002jd2456871p6250f001.yaml ngc6397id000000002jd2456871p6250f001.fits
spexxy ngc6397id000000002jd2456871p6250f003.yaml ngc6397id000000002jd2456871p6250f003.fits
spexxy ngc6397id000000002jd2456871p6250f004.yaml ngc6397id000000002jd2456871p6250f004.fits
如果看起来正确,请删除--dry run
,然后真正运行它。您还可以添加其他内容,例如:
这将为您提供“预计到达时间”parallel--eta…
它提供了一个进度条parallel--bar…
一次运行8个作业,而不是默认的每个CPU核运行1个作业parallel-j8…
Spexxy config.yaml file.fits
parallel spexxy {.}.yaml {} ::: *fits
parallel --dry-run spexxy {.}.yaml {} ::: *fits
find . -maxdepth 1 -name \*fits -print0 | parallel -0 spexxy {.}.yaml {}
- 使用
列出当前目录中扩展名为.fits的所有文件find
- 使用
删除扩展名sed
- 使用
为每个文件运行命令xargs
我们如何区分一个
config.yaml
和另一个config.yaml
来确定哪个文件与哪个文件一起使用?您必须将Spexxy
应用到的所有文件是否都位于同一目录中?如果没有,在哪里?您需要提供足够的信息,以便我们不必猜测来尝试解决您的问题。A应该提供,但我理解如果您刚刚开始,这可能是不可能的,但您至少需要提供详细信息,使我们能够帮助您达成一个。请编辑并提供必要的详细信息。当我们没有任何逻辑如何为每个文件指定正确的config.yaml
时,一个易读的答案是制作一个约5000行的脚本,每行有一个Speccy some.yaml somefile.fits
。您可以从此文件中提取Speccy
(使用循环或xargs
),但我希望有其他方法来指定文件和YAMMEL。请注意spexxy
可以使用相同的config.yaml处理多个fits文件。如果您配置的文件很少,请考虑<代码> SXXYXOX1.1.AML FLIE1.FIL.FIL2.FIL3.FILTS…<代码>,对于每个配置文件。实际上,我刚刚开始,所以我承认现在可能还不够清楚,我将在明天编辑,以更好地解释这是如何发生的,谢谢您的回答!我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢您肯定想要xargs-p8
之类的吗?