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可以读取这些文件名,并可能处理这些文件(。