bash - for 循环遍历多个目录及其文件

bash - for loop through multiple directories and their files

我在同一路径下有 5 个目录 my_path/:

my_path/1951 
my_path/1952 
my_path/1953 
my_path/1954 
my_path/1955

每个目录包含不同数量的以 .nc 结尾的 netcdf 文件。

我需要通过在每个目录和文件中循环来执行 CDO 命令。以下命令仅适用于第一个目录和文件 my_path/1951/*.nc:

for i in my_path/1951/*.nc
do
   cdo selyear,1951/1970 "$i" "$i"2
done

命令select从目录中的nc文件开始,从目录的年份开始,到20年后结束。

因此对于第二个目录,它将是:

for i in my_path/1952/*.nc
do
   cdo selyear,1952/1971 "$i" "$i"2
done

第三个:

for i in my_path/1953/*.nc
do
   cdo selyear,1953/1972 "$i" "$i"2
done

等...

有没有一种方法可以使用唯一的 for 循环或嵌套的 for 循环来完成所有操作,而不是为每个目录重复上面的 for 循环?

请您尝试以下操作:

#!/bin/bash

for i in my_path/*/; do
    year=${i%/}; year=${year##*/}       # extract year
    year2=$(( year + 19 ))              # add 19
    for j in "$i"*.nc; do
        echo cdo "selyear,${year}/${year2}" "$j" "$j"2
    done
done

它将命令行输出为干运行。如果看起来不错,请删除 echo 和 运行。

for x in $@
 for i in my_path/$x/*.nc
  ...

您可以通过获取 sh 脚本的参数来执行 On2 for。

yourScript.sh 1951 1952 ...

之后您可以将所有文件夹传递给您的脚本。

yourScript.sh ./*

你可以这样循环:

shopt -s nullglob
for i in my_path/195[1-5]/*.nc
do
  ...
done 

shopt 命令确保循环工作,即使某些目录不包含 nc 文件。