bash脚本遍历文件夹

时间:2021-06-18 07:05:06

标签: bash shell

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

1 个答案:

答案 0 :(得分:0)

您可以使用命令 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 可以读取这些文件名并可能处理这些文件)。