我在 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
答案 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 可以读取这些文件名并可能处理这些文件)。