使用shell将程序应用于数千个文件

使用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 |

直到现在我才使用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 | 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…
    它提供了一个进度条
  • parallel-j8…
    一次运行8个作业,而不是默认的每个CPU核运行1个作业
还要注意的是,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 {}
  • 使用
    find
    列出当前目录中扩展名为.fits的所有文件
  • 使用
    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
之类的吗?