我有几个文件夹,每个文件夹都包含几个.nc
文件。我想遍历所有文件夹,并为每个文件夹使用cdo
具有相似模式的文件进行一些计算(合并时间)。到目前为止,我已经写了以下内容:
for dir in /mnt/meteo_a/africa_cordex/historical/0.44/pr/*/
do
dir=${dir%*/}
echo ${dir##*/}
export dir
cd $dir
pwd
for f in `find . -type f -regex /(.*?\day)/*`
cdo mergetiem io
done
done
每个文件夹中的文件具有如下名称:
pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19500101-19501231.nc
pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19510101-19551231.nc
pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1_day_19491201-19501231.nc
pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1_day_19510101-19551231.nc
我想对之前具有相似模式的所有文件应用 mergetime CDO 命令_day_
。
我想合并前两个文件和后两个文件。更具体地说,合并以
"pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_"
同样合并以
"pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1"
合并时间的输出可能类似于:
{pattern}_mergetime.nc
此脚本片段适用于您的示例文件
解释:
for
循环每行echo
打印一个文件名。sed
命令删除_day_
所有后续字符。sort -u
对部分文件名进行排序并删除重复项。while read -r pattern
每行读取一个模式并在模式上循环"${pattern}"*
由 shell 扩展为以模式开头的所有文件名比可能的
for
循环更好echo
这将打印
*.nc
当前目录中匹配的所有文件名,不包含子目录。您可以将其与类似于问题中脚本的所有子目录的循环结合使用
而不是
cd
我建议pushd
允许popd
稍后返回。您还可以
for
将目录上的循环替换为额外的find