bash脚本来遍历文件夹



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

#!/bin/bash
echo -e "sw00092413002xpcw3po_cl.evt 
sw00092413002xpcw3po_cl_bary4.evt 
sw00092413002sao.fits.gz" | barycorr ra=253.467570 dec=39.760169

您可以使用命令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 ..

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

以下命令在output01目录内执行:ls-w*pcw3po_cl.evt并将结果放入变量f1:

f1=$(ls sw*pcw3po_cl.evt)

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

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

以下命令执行:ls-w*sao.fits.gz在目录output01内,并将结果放入变量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的应用程序中,作为该应用程序的标准输入(因此barycorl可以读取这些文件名,并可能处理这些文件(。

相关内容

  • 没有找到相关文章

最新更新