【问题标题】:bash script to iterate through folders用于遍历文件夹的 bash 脚本
【发布时间】:2021-06-18 07:05:06
【问题描述】:

我在 Test 目录中有 5 个文件夹,名称为 output001 到 output005。每个输出文件夹中都有文件名 *.cl_evt 的文件。我想输入每个输出文件夹并想在 bash shell 脚本中运行以下命令。如何遍历每个文件夹并通过 bash shell 脚本运行以下代码?

#!/bin/bash

echo -e "sw00092413002xpcw3po_cl.evt 
sw00092413002xpcw3po_cl_bary4.evt 
sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169

【问题讨论】:

  • 没有“文件夹”。 “文件夹”是 gui 的工件。当您在 shell 中工作时,习惯于将它们视为“目录”。这不仅仅是语义问题。文件夹包含文件,目录不包含。目录包含名称。未能理解这种区别是最普遍的误解之一。

标签: bash shell


【解决方案1】:

您可以使用命令 seq(带有格式)生成目录名称中的数字...就像这样:

for i in $(seq -f "%03g" 1 5); do 
    cd output$i
    echo -e "sw00092413002xpcw3po_cl.evt 
    sw00092413002xpcw3po_cl_bary4.evt 
    sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169 
    cd ..
done

如果要调整各个子目录下数据文件的名称,可以这样写:

for i in $(seq -f "%03g" 1 5); do 
    cd output$i
    f1=$(ls sw*pcw3po_cl.evt 2>/dev/null)
    if [ "$f1" == "" ] ; then
        echo "no data file in directory output$i"
        continue 
    else
        f2=${f1/pcw3po_cl.evt/pcw3po_cl_bary4.evt}
        f3=$(ls sw*sao.fits.gz)
        echo -e "$f1
        $f2 
        $f3" | barycorr ra=253.467570 dec=39.760169 
    fi
    cd ..
done

脚本分解:

命令:

seq -f "%03g" 1 5

生成序列:

001
002
003
004
005

这意味着循环:

for i in $(seq -f "%03g" 1 5); do

将循环5次,变量i依次取值001、002、003、004、005

在每个循环中,我们运行一些命令。 (我们来分析当i包含001时的第一个循环):

循环的第一行:

cd output$i

相当于output001(所以我们进入目录output001)。

循环的最后一行:

cd ..

在目录树中上升一级(即返回到您在脚本开始时所在的目录)。

执行以下命令:ls sw*pcw3po_cl.evt在目录output001中,并将结果放入变量f1:

f1=$(ls sw*pcw3po_cl.evt)

以下命令采用变量 f1,将字符串 pcw3po_cl.evt 替换为 pcw3po_cl_bary4.evt 并将结果放入变量 f2 中:

f2=${f1/pcw3po_cl.evt/pcw3po_cl_bary4.evt}

执行以下命令:ls sw*sao.fits.gz在目录output001中,并将结果放入变量f3:

f3=$(ls sw*sao.fits.gz)

以下命令:

echo -e "$f1 $f2 $f3" | barycorr ra=253.467570 dec=39.760169 

打印出 3 个变量 f1 f2 和 f3 的值(希望包含名称匹配的目录的文件(依次)swpcw3po_cl.evt、swpcw3po_cl_bary4.evt 和 sw* sao.fits.gz

然后它将这些值“管道”到名为 barycorr 的应用程序中,作为该应用程序的标准输入(因此 barycorr 可以读取这些文件名并可能处理这些文件)。

【讨论】:

  • 但我有一个问题。你能帮我解决这个问题吗?我需要首先输入文件名 swpcw3po_cl.evt,其次是我要保存的文件名,如 swxpcw3po_cl_bary4.evt,第三是 sw*sao.fits.gz 文件所在的路径。 * 根据我所在的文件夹而变化。现在如何编写脚本以在每个文件夹中运行该程序。
  • 输入在上面代码中的 echo -e 之后。
  • 我正在尝试通过编辑上面的帖子来回复(因为它可以让我格式化代码)...
  • 非常感谢您的努力。我认为 echo -e 在编辑后的答案中丢失了一些东西。实际上我们可以像命令:echo -e "sw00092413002xpcw3po_cl.evt sw00092413002xpcw3po_cl_bary4.evt sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169那样做。通过仅在循环中更改“000924413002”来在迭代中运行它,即从 2 到 5 其他保持不变。如果一个数字不存在,比如错过了 3,那么它会引发错误。也需要绕过这个错误。
  • 不客气.. 哎呀,对不起:当我试图关闭 echo -e 的双引号时出现了一个错字.. 应该在新编辑的帖子中填写..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2011-01-09
  • 2023-03-14
相关资源
最近更新 更多